我正在使用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....
}
Dao Layer ......
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类型。
我是对的?????
答案 0 :(得分:0)
此查询存在两个问题。
第一个是您没有将它作为数组传递,因此解析器抛出异常。您应该像这样添加[
和]
:
String query = "db.jangad.aggregate([{'$project': { 'totalStones': { '$size':'$setOfSalesStoneCharacteristics' }}} , { '$match' : { '_id' :ObjectId('5a60784e8daff90498ba74e4')} }] )";
这应该有用。
但如果您只对totalStones
感兴趣,为什么不回复这个价值呢?
它看起来像这样:
String totalStones = "db.jangad.aggregate([{'$project': { 'totalStones': { '$size':'$setOfSalesStoneCharacteristics' }}} , { '$match' : { '_id' :ObjectId('5a60784e8daff90498ba74e4')} }, {'$project':{ '_id': 0}}] )";
Integer size = (Integer) em.createNativeQuery( query ).getSingleResult();
如果您只需要特定字段,则不必每次都创建一个对象,并且您不必在实体上映射totalStones字段。
编辑:由于识别0的错误,最后一个查询仅适用于Hibernate OGM 5.2.CR1之后的版本
如果您想/需要创建实体对象,请确保查询返回所有字段,否则OGM将创建一个不完整的对象。在这种情况下,Jangad只会设置id和totalStones属性。