编程语言
首页 > 编程语言> > java – 具有投影的Hibernate标准,不执行@OneToMany映射的查询

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

作者:互联网

我有一个域对象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为col_1_0_ ,. as col_2_0_,expense1_.account_id as col_3_0_.的.因为col_2_0_是初始字段将被拉出的位置.我的猜测是它应该是expense1_.id为col_2_0_.

编辑:我刚刚删除了Result Transformer以检查每个属性,而initialFields属性确实为null.

解决方法:

我有类似的问题,对我来说是明确指定条件中的joinType.

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

标签:java,hibernate,hibernate-criteria,projection
来源: https://codeday.me/bug/20190630/1340515.html