如何限制Hibernate仅从Criteria API中涉及多个实体的根实体生成带有列的SQL查询

马约尔

我已使用包含多个实体的标准API编写了休眠代码(具有父子关系,并且我正在使用createAlias()来连接实体),期望在结果中仅获取根实体。

但是,当我调试由hibernate生成的SQL时,我发现hibernate正在为join子句(通过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>>

如果您观察到休眠状态已生成查询以获取所有实体(A,B和C)的所有列,但是截至目前,我不需要除根实体(B)以外的任何实体,应获取诸如A&C之类的实体的数据后来按照它们到B的映射上的提取策略进行操作。我认为无需为此查询通过n / w流量获取所有数据,但休眠仍会像这样生成查询。

有没有一种方法可以引导冬眠只使用条件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>>
弗拉德·米哈尔西娅(Vlad Mihalcea)

遗留条件已弃用。您可以通过JOIN指令(而不是FETCH)使用支持此功能的JPA标准。

或者,使用JPQL:

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何克服Hibernate Criteria和Example API的限制?

如何使用 Criteria API 从 Hibernate 中的实体获取列表?

如何在 Hibernate Criteria 查询的两个不同别名之间创建限制?

如何从非实体类型的SQL查询中检索多个列?

Hibernate中的Criteria API,联接表中同一列的多个限制

如何在Flask中创建涉及多个实体的表单?

JPA / HIBERNATE:如何查询返回非实体对象或带有内部非实体对象的对象列表?

限制Doctrine查询中的根实体数量,但允许任意数量的连接实体

如何在带有多个表的sqlplus中编写涉及的递归子查询以跟踪节点?

Hibernate Search查询多个实体

如何使用查询生成器在Symfony 4中的外部ID上连接多个实体?

如何将带有动态HTML的Razor页面中的多个实体添加到可编辑实体?

访问关联实体的ID时Hibernate生成SQL查询

如何从多个实体中获取条件Hibernate

DDD 如何设计涉及相关实体的服务/聚合根

如何在SQL Server Management Studio中优化由实体框架生成的SQL查询?

使用Hibernate的Criteria API,我可以使用具有类似限制的concat吗?

如何限制Hibernate Envers中的审核类型

如何将带有分组依据、聚合和连接的 SQL 查询转换为实体框架查询?

如何从Hibernate Criteria API获取SQL(*不*用于记录)

将Hibernate Criteria与不同关系属性中的限制一起使用

如何从azure表存储查询中获取1000多个实体?

如何使HIbernate提取根实体的所有属性以及仅关联实体的特定属性?

如何限制char数组在C ++中仅从字符串中获取a和b?

如何在OData v4 API中具有动态可查询实体?

如何编写超类的Hibernate Criteria查询,并检查某些子类?

如何在Hibernate中为内部查询设置限制?

如何在 Hibernate Lucene Search 中添加多个限制?

如何使用 Hibernate 在 Spring Boot 中查询实体的所有关系对象?