gpt4 book ai didi

java - 如何限制 Hibernate 仅生成来自涉及多个实体的 Criteria API 中根实体的列的 SQL 查询

转载 作者:太空宇宙 更新时间:2023-11-04 09:57:04 24 4
gpt4 key购买 nike

我已经编写了带有涉及多个实体的标准 API 的 hibernate 代码(具有父子关系并且我正在使用 createAlias() 来加入实体),期望只获取结果中的根实体。

但是,当我调试 hibernate 生成的 SQL 时,我观察到 hibernate 正在为 join 子句中使用的所有实体获取数据(在 select 子句中)(通过 createAlias() 实现)。

我认为除了预期的根实体之外,没有必要获取其他实体的列,因为它可能效率不高,而我希望避免这种情况?

我使用的是 Hibernate 版本 3.6.9

这是场景。有 3 个实体 A、B 和 C 具有父子关系,其方式如下:A( super 父级)-> B(父级)-> C(子级)

session.createCriteria(B.class, "b")
.createAlias("b.c", "c",Criteria.INNER_JOIN)
.createAlias("b.a", "a",Criteria.INNER_JOIN)
.add(Restrictions.in("c.prop1c", <<some value>>))
.add(Restrictions.in("a.prop1a", <<some value>>))
criteria.list()

now when hibernate generates the SQL it looks like
select
b.all columns of B
a.all columns of A
c.all columns of C
from B b
inner join A a on b.prop=a.prop
inner join C C on b.prop=c.prop
where
c.prop1c = <<some value>>
a.prop1a = <<some value>>

如果您观察到 hibernate 已生成查询来获取所有实体(A、B 和 C)的所有列,但是到目前为止,我不需要除根实体(B)之外的任何实体,像 A 和 C 这样的实体的数据应该稍后根据其映射到 B 的获取策略来获取。我认为没有必要通过该查询的网络流量获取所有数据,hibernate 仍然会生成这样的查询。

有没有办法引导 hibernate 使用标准 API 只获取实体 B 的列,而不获取 A 和 C 的列?

select 
b.all columns of B
from B b
inner join A a on b.prop=a.prop
inner join C C on b.prop=c.prop
where
c.prop1c = <<some value>>
a.prop1a = <<some value>>

最佳答案

旧标准已弃用。您可以使用 JPA Criteria,它通过 JOIN 指令(而不是 FETCH)支持此操作。

或者,使用 JPQL:

select b
from B b
inner join b.a. a
inner join b.a. c
where
c.prop1c = :prop1c
a.prop1a = :prop1a

关于java - 如何限制 Hibernate 仅生成来自涉及多个实体的 Criteria API 中根实体的列的 SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53993982/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com