Hibernate标准,投影不执行@OneToMany映射的查询

时间:2011-01-11 19:50:32

标签: java hibernate projection hibernate-criteria

我有一个域对象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。

1 个答案:

答案 0 :(得分:3)

我遇到了类似的问题,而且我在标准中明确指定 joinType

Criteria criteria = session.createCriteria(Payment.class);
criteria.createAlias("expense", "e", CriteriaSpecification.LEFT_JOIN);