如何限制 Hibernate 仅从涉及多个实体的 Criteria API 中的根实体的列生成 SQL 查询
How to restrict Hibernate to generate SQL query with columns only from root entity in Criteria API involving multiple entities
我编写了包含多个实体的标准 API 的休眠代码(具有父子关系并且我正在使用 createAlias() 加入实体)期望在结果中只获取根实体。
但是,当我调试由 hibernate 生成的 SQL 时,我观察到 hibernate 正在为连接子句中使用的所有实体(通过 createAlias() 实现)获取数据(在 select 子句中) ).
我认为除了预期的根实体之外,没有必要为其他实体获取列,因为它可能效率不高,我想避免这种情况?
我正在使用 Hibernate 版本 3.6.9
场景如下。有 3 个实体 A、B 和 C 具有以下方式的父子关系 A(超级父)-> 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 的映射的提取策略来提取。
我认为没有必要为此查询通过 n/w 流量获取所有数据,休眠仍在生成这样的查询。
有没有一种方法可以引导休眠仅获取实体 B 的列,而不是使用条件 API 获取实体 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
我编写了包含多个实体的标准 API 的休眠代码(具有父子关系并且我正在使用 createAlias() 加入实体)期望在结果中只获取根实体。
但是,当我调试由 hibernate 生成的 SQL 时,我观察到 hibernate 正在为连接子句中使用的所有实体(通过 createAlias() 实现)获取数据(在 select 子句中) ).
我认为除了预期的根实体之外,没有必要为其他实体获取列,因为它可能效率不高,我想避免这种情况?
我正在使用 Hibernate 版本 3.6.9
场景如下。有 3 个实体 A、B 和 C 具有以下方式的父子关系 A(超级父)-> 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 的映射的提取策略来提取。 我认为没有必要为此查询通过 n/w 流量获取所有数据,休眠仍在生成这样的查询。
有没有一种方法可以引导休眠仅获取实体 B 的列,而不是使用条件 API 获取实体 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