我有一个域对象Expense,它具有一个名为initialFields的字段。
注释如下:
@OneToMany(fetch = FetchType.EAGER, cascade = { CascadeType.ALL }, orphanRemoval = true)
@JoinTable(blah blah)
private final List<Field> initialFields;
现在,出于性能原因,我试图使用Projections来仅提取某些字段,但是这样做时,initialFields字段始终为null。这是唯一的ToToMany字段,也是我尝试通过这种方式进行投影的唯一字段。如果我使用常规的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_
。会在其中拖动initialField的. as col_2_0_ is
。我的猜测是应该是expense1_.id as col_2_0_
。编辑:我只是删除了结果转换器以检查每个属性,并且initialFields属性确实为空。
最佳答案
我有类似的问题,对我来说,我正在明确地在条件中指定joinType。
Criteria criteria = session.createCriteria(Payment.class);
criteria.createAlias("expense", "e", CriteriaSpecification.LEFT_JOIN);