【发布时间】:2018-01-18 11:04:50
【问题描述】:
我正在使用 Hibernate OGM (5.2.0.Alpha1) 和 Mongodb (3.4)
例子:
@Entity
@Table(name = "jangad")
@JsonInclude(Include.NON_EMPTY)
public class Jangad {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@JsonSerialize(using = ToStringSerializer.class)
public ObjectId id;
public String name;
@OneToMany(mappedBy = "jangad")
public Set<SalesStoneCharacteristics> setOfSalesStoneCharacteristics;
// Note : Integer data type for this not working with aggregation result.
public Integer totalStones;
getter....
setter....
}
@Entity
@Table(name = "sales_stone_details")
@JsonInclude(Include.NON_EMPTY)
// @JsonFilter(value = SalesUtils.MY_CUSTOM_FILTER_FOR_SURAT_POLISH_STONES)
public class SalesStoneCharacteristics {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "SALES_STONE_CHARACTERISTICS_ID", unique = true, nullable = false)
@JsonSerialize(using = ToStringSerializer.class)
public ObjectId id;
private String name;
@ManyToOne
@JsonIgnore
private Jangad jangad;
setter....
getter....
}
道层……
public <T> List<T> executeQuery(String query, Integer startPosition, Integer noOfRecords, T t) {
List<T> listOfT = new ArrayList<>();
if (SalesUtils.isObjectisNullOrEmpty(startPosition, noOfRecords)) {
listOfT = entityManager.createNativeQuery(query.toString(), t.getClass()).getResultList();
} else {
listOfT = entityManager.createNativeQuery(query.toString(), t.getClass()).setFirstResult(startPosition)
.setMaxResults(noOfRecords).getResultList();
}
return SalesUtils.isListIsNullOrEmpty(listOfT) ? new ArrayList<>() : listOfT;
}
服务层....(错误)
@Transaction
public void executeQuery() {
String query = "db.jangad.aggregate({'$project': { 'totalStones': { '$size':'$setOfSalesStoneCharacteristics' }}} , { '$match' : { '_id' :ObjectId('5a60784e8daff90498ba74e4')} } )";
List<Jangad> listOfJangads = jangadDao.executeQuery(sb.toString(), null, null, new Jangad());
if (!SalesUtils.isListIsNullOrEmpty(listOfJangads)) {
System.out.println(listOfJangads.get(0).getTotalStones()) // Error
}
}
临时解决方案: 将 totalStones 的字段类型从 Integer 更改为 Jangad.java 的 int
服务层的错误说明......(错误)
如果我将 totalStones 类型设置为 Wrapper 类型(如 Integer、Double),则会出现错误, 所以我必须将该字段类型设置为 int 或 double。
似乎聚合结果不适用于任何 Java Wrapper 类型。
我说的对吗????
【问题讨论】:
-
我不明白这个查询: String query = "db.jangad.aggregate({'$project': { 'totalStones': { '$size':'$setOfSalesStoneCharacteristics' }}} , { '$match' : { '_id' :ObjectId('5a60784e8daff90498ba74e4')} } )";
-
一个 Jangad 有多个石头(SalesStoneCharacteristics),所以我想要 Jangad 中可用的石头总数,其中 id 为“5a60784e8daff90498ba74e4”... Mongobooster 结果为上述查询:_id:ObjectId('5a60784e8daff90498ba74e4' )totalStones:10(数据类型Int32)错误如下:org.bson.json.JsonParseException:JSON阅读器期待一个值,但发现'db'。我明天会给你完整的错误。
-
你看,错误不是你之前添加评论的地方,当你运行查询时。当你问一些事情时,如果你不准确,就会很混乱。无论如何,我解决了这个问题。
标签: java spring hibernate jpa hibernate-ogm