Hibernate标准与投影不执行查询@OneToMany映射 [英] Hibernate criteria with projection not performing query for @OneToMany mapping
问题描述
我有一个域对象Expense,它有一个名为 initialFields 的字段。
它的注释如下:
@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(费用,e);
ProjectionList properties = Projections.projectionList();
//一些限制和更多字段
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作为col_1_0_,。 as col_2_0_,expense1_.account_id as col_3_0 _
。 。因为col_2_0_是
,其中initialFields将被拉出。我的猜测是它应该是 expense1_.id作为col_2_0 _
。
编辑:我刚刚删除了Result Transformer检查每个属性,并且initialFields属性确实为null。
我有类似的问题,对我来说是在标准中明确指定 joinType 。
Criteria criteria = session.createCriteria(Payment.class);
criteria.createAlias(费用,e,CriteriaSpecification.LEFT_JOIN);
I have a domain object, Expense, that has a field called initialFields.
It's annotated as so:
@OneToMany(fetch = FetchType.EAGER, cascade = { CascadeType.ALL }, orphanRemoval = true)
@JoinTable(blah blah)
private final List<Field> initialFields;
Now I'm trying to use Projections in order to only pull certain fields for performance reasons, but when doing so the initialFields field is always null. It's the only OneToMany field and the only field I am trying to retrieve with the projection that is behaving this way. If I use a regular HQL query initialFields is populated appropriately, but of course I can't limit the fields.
Partial projection code:
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();
When I turn on debugging and turn on show sql, the query to pull the initialFields doesn't appear to be created/run. Anyone ever seen anything like this?
I've just tried using HQL projection, by specifying each field I want to pull and then manually building the object. In this case the SQL built by Hibernate is incorrect for the initialFields field. expense1_.name as col_1_0_, . as col_2_0_, expense1_.account_id as col_3_0_
. The . as col_2_0_ is
where the initialFields would be pulled. My guess is that it should be expense1_.id as col_2_0_
.
Edit: I just removed the Result Transformer to inspect each property and the initialFields property is indeed null.
I had similar problem and for me was working explicitly specifying joinType in criteria.
Criteria criteria = session.createCriteria(Payment.class);
criteria.createAlias("expense", "e", CriteriaSpecification.LEFT_JOIN);
这篇关于Hibernate标准与投影不执行查询@OneToMany映射的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!