我有一个域对象Expense,它有一个名为 initialFields 的字段。
它的注释如下:
@OneToMany(fetch = FetchType.EAGER, cascade = { CascadeType.ALL }, orphanRemoval = true)
@JoinTable(blah blah)
private final List<Field> initialFields;
现在我正在尝试使用Projections以便仅出于性能原因而拉出某些字段,但是这样做时,initialFields字段始终为null。它是唯一的OneToMany字段,也是我尝试使用这种方式进行检索的唯一字段。如果我使用常规HQL查询,则会正确填充initialFields,但当然我不能限制字段。
部分投影代码:
Criteria criteria = session.createCriteria(Payment.class);
criteria.createAlias("expense", "e");
ProjectionList properties = Projections.projectionList();
//Some restrictions and more fields
properties.add(Projections.property("e.initialFields"), "initialFields");
criteria.setProjection(properties);
criteria.setFetchMode("e.initialFields", FetchMode.JOIN);
criteria.setReadOnly(true);
criteria.setResultTransformer(Transformers.aliasToBean(Expense.class));
return criteria.list();
当我打开调试并打开show sql时,拉出initialFields的查询似乎没有创建/运行。有没有见过这样的人?
我刚尝试使用HQL投影,通过指定我要拉的每个字段然后手动构建对象。在这种情况下,Hibernate构建的SQL对于initialFields字段是不正确的。 expense1_.name as col_1_0_, . as col_2_0_, expense1_.account_id as col_3_0_
。初始字段将被拉出的. as col_2_0_ is
。我的猜测应该是expense1_.id as col_2_0_
。
编辑:我刚刚删除了Result Transformer以检查每个属性,而initialFields属性确实为null。
答案 0 :(得分:3)
我遇到了类似的问题,而且我在标准中明确指定 joinType 。
Criteria criteria = session.createCriteria(Payment.class);
criteria.createAlias("expense", "e", CriteriaSpecification.LEFT_JOIN);