GoodEvening 我是 mongo 的新手,我選擇使用 RepositoryPattern 和 Mongotemplate 的混合搭配
現在,當我想使用 MongoTemplate 檢索內部物件的特定值以計算漸進式 ID 時,我發現一個非常奇怪的錯誤似乎我的代碼適用于集合中的 0 或 1 個檔案,但是當我有相等或更多超過 2 個檔案,該方法將拋出一個
org.springframework.dao.IncorrectResultSizeDataAccessException: Query { "$java" : Query: {}, Fields: {}, Sort: {} } returned non unique result.
好像限制不起作用。我現在只有一個休息和一個存盤庫模式,但是在服務層我有另一個自動裝配 whit mongotemplate 類,這個模板只被一種方法使用。
public DetailedOrder findTheBiggestBy(String byWhat){
Query query = new Query();
query.with(Sort.by(Sort.Direction.DESC,byWhat)).limit(1);
return mongoDb.findOne(query,DetailedOrder.class);
}
正如您所看到的,它非常簡單并且它確實有效,因為在將模板移動到服務中之前,當我將它自動連接到其余層時,它實際上適用于集合中的各種檔案。
我想念的東西與mongo無關,但與spring autowire有關?
我的 detailorderClass 是
package com.service.backend.BK.Pojo;
import com.service.backend.BK.Constants.Constant;
import org.bson.codecs.pojo.annotations.BsonId;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.data.mongodb.core.mapping.Field;
import org.springframework.data.mongodb.core.mapping.FieldType;
import org.springframework.data.mongodb.core.mapping.MongoId;
import java.util.List;
@Document("Orders")
public class DetailedOrder {
@MongoId(FieldType.OBJECT_ID)
private String id;
@Field
private List<Integer> category;
// 1 junk to 10 Pristine
@Field
private Integer quality;
@Field
private BaseOrder baseOrder;
@Field
private String qualityDescription;
public DetailedOrder(){}
public DetailedOrder(String Description,Double price, List<Integer> category, Integer quality) {
this.category = category;
this.quality = quality;
this.qualityDescription = qualityDescriptionPairFactory(quality);
this.baseOrder=new BaseOrder(Description,price);
}
public List<Integer> getCategory() {
return category;
}
public void setCategory(List<Integer> category) {
this.category = category;
}
public Integer getQuality() {
return quality;
}
public void setQuality(Integer quality) {
this.quality = quality;
}
public String getQualityDescription() {
return qualityDescription;
}
public void setQualityDescription(String qualityDescription) {
this.qualityDescription = qualityDescription;}
private String qualityDescriptionPairFactory(int quality){
switch (quality){
case 1:return Constant.Quality.NOGRAD.label;
case 2:return Constant.Quality.HEAVYDMN.label;
case 3:return Constant.Quality.LOOSE.label;
case 4:return Constant.Quality.POOR.label;
case 5:return Constant.Quality.LIGHTDMN.label;
case 6:return Constant.Quality.GOOD.label;
case 7:return Constant.Quality.EXCELENT.label;
case 8:return Constant.Quality.NEARMINT.label;
case 9:return Constant.Quality.MINT.label;
case 10:return Constant.Quality.NEWUNRL.label;
default:return Constant.Quality.NOGRAD.label; }
}
@Override
public String toString() {
return "DetailedOrder{"
"id='" id '\''
", baseOrder='" getBaseOrder().returnBaseOrder() '\''
", category=" category
", quality=" quality
", qualityDescription='" qualityDescription '\''
'}';
}
public BaseOrder getBaseOrder() {
return baseOrder;
}
public void setBaseOrder(BaseOrder baseOrder) {
this.baseOrder = baseOrder;
}
public void setId(String id) {
this.id = id;
}
}
并導致 baseOrderClass
package com.service.backend.BK.Pojo;
import org.joda.time.DateTime;
import org.springframework.data.mongodb.core.mapping.Document;
public class BaseOrder {
private String id;
private String description;
private Double desideredPrice;
//Pending,active,Rejected,Hault,etc etc
private int status;
protected BaseOrder(){}
protected BaseOrder(String description, Double desideredPrice) {
this.description = description;
this.desideredPrice = desideredPrice;
}
public String returnBaseOrder(){
return "BaseOrder{"
"id='" id '\''
", description='" description '\''
", desideredPrice=" desideredPrice
", status=" status
'}';
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public Double getDesideredPrice() {
return desideredPrice;
}
public void setDesideredPrice(Double desideredPrice) {
this.desideredPrice = desideredPrice;
}
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
//###############################################################################################################//
}
uj5u.com熱心網友回復:
與彈簧背景關系問題相關的 OPs 問題。通過直接訪問存盤庫,可以解決問題。
在評論中發現了一個額外的問題/目標,我想為此提供一個答案。
如何在域層內進行持久訪問?
我在GitHub 上創建了一個存盤庫,您可以在其中找到有效的解決方案。此代碼不是最佳實踐,但會提供有效的解決方案。
每個構造的域物件都需要訪問宣告的存盤庫。使用依賴注入時,這可能是一個問題。為了保持物體構造的原始性,引入了一個抽象類,該類負責獲取具體的存盤庫。
核心思想是使 Spring 可ApplicationContext靜態訪問。讓這個背景關系訪問存盤庫只是一個電話。
具有介面的 BeanApplicationContextAware將在 Spring Boots 啟動的早期階段被呼叫。當使用此類訪問背景關系時,每個消費者都必須在加載 Spring 后呼叫它。這可以通過使用@Component, @Configuration,@Bean來運行代碼來實作,并且不會出現競爭條件。
更多詳細資訊在存盤庫自述檔案中。
我希望這對你有幫助:)
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/498485.html
上一篇:org.springframework.web.servlet.PageNotFoundnoHandlerFound得到這個
