java - 具有投影的 Hibernate 条件不执行 @OneToMany 映射查询

标签 java hibernate projection hibernate-criteria

我有一个域对象 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("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_ . . as col_2_0_ is将提取 initialFields 的位置。我猜应该是expense1_.id as col_2_0_ .

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

最佳答案

我遇到了类似的问题,对我来说,工作是在标准中明确指定 joinType

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

关于java - 具有投影的 Hibernate 条件不执行 @OneToMany 映射查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4661919/

相关文章:

hibernate - 使用 hibernate 连接2个表的最佳方法

python - 点到线段的投影 Python Shapely

json - d3.geo : Path vs. 投影

java - 如何以不同的方式打印 getString 的值?

java - 只更新非空字段

java - 在 javaFX 中的 Togglegroup 上没有按下 toggleButton 时收听

java - 配置 hibernate.cfg.xml 文件

math - 视场中的 Kinect 内在参数

java - 在 drool 中维护单独的规则文件

java - Eclipse插件: how to read the "settings.xml" file path which is configured in M2Eclipse plugin