Jos*_*osh 5 java hibernate projection hibernate-criteria
我有一个域对象 Expense,它有一个名为initialFields的字段。
它是这样注释的:
@OneToMany(fetch = FetchType.EAGER, cascade = { CascadeType.ALL }, orphanRemoval = true)
@JoinTable(blah blah)
private final List<Field> initialFields;
Run Code Online (Sandbox Code Playgroud)
现在我正在尝试使用 Projections 以便出于性能原因仅提取某些字段,但是这样做时 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();
Run Code Online (Sandbox Code Playgroud)
当我打开调试并打开 show 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 属性确实为空。
我遇到了类似的问题,对我来说,正在标准中明确指定joinType。
Criteria criteria = session.createCriteria(Payment.class);
criteria.createAlias("expense", "e", CriteriaSpecification.LEFT_JOIN);
Run Code Online (Sandbox Code Playgroud)