2011-01-11 110 views
4

我有一个域对象,费用,有一个字段名为initialFields休眠条件与投影不执行查询@OneToMany映射

它标注为这样:

@OneToMany(fetch = FetchType.EAGER, cascade = { CascadeType.ALL }, orphanRemoval = true) 
@JoinTable(blah blah) 
private final List<Field> initialFields; 

现在我试图用突起以仅拉动某些领域由于性能原因,但是当这样做的initialFields场总是空。这是唯一的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(); 

当我打开调试,打开显示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其中initialFields将被拉。我的猜测是它应该是expense1_.id as col_2_0_

编辑:我刚刚删除了Result Transformer来检查每个属性,并且initialFields属性确实为null。

回答

3

我有类似的问题,对我来说,在标准中明确指定joinType

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

有趣的是,如果我回到那个代码,我将不得不尝试这个。谢谢 – Josh 2011-03-17 12:21:39