Hibernate标准与投影不执行查询@OneToMany映射 [英] Hibernate criteria with projection not performing query for @OneToMany mapping

查看:125
本文介绍了Hibernate标准与投影不执行查询@OneToMany映射的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆