当前位置: 首页 > 知识库问答 >
问题:

如何在涉及多个实体的标准API中限制HiberNate仅从根实体生成包含列的SQL查询

郑承恩
2023-03-14

我已经用包含多个实体(具有父子关系)的标准API编写了hibernate代码

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

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

我正在使用Hibernate 3.6.9版

这是一个场景。有3个实体A、B

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)的所有列

有没有一种方法可以引导hibernate只获取实体B的列,而不获取实体a的列

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>>

共有1个答案

齐乐
2023-03-14

旧版标准已弃用。您可以使用 JPA 标准,它通过 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
 类似资料:
  • 问题内容: 我可以为一个实体使用多个序列生成器吗? 问题答案: 你不能。该生成器仅适用于标识符列。 确保使用脚本(例如)创建此序列: 然后使用如下映射:

  • 我正在使用EclipseLink 2.3。带有WebLogic 12c的x。这是JQL: 从PR\U GL\U CA\U账户中选择o 这将生成以下错误堆栈: 内部异常:com。国际商用机器公司db2。jcc。是io:DB2 SQL错误:SQLCODE=-206,SQLSTATE=42703,SQLERRMC=DISPLAYGLMAPCODE,DRIVER=3.57.82 错误代码:-206 调用:

  • 尝试获取父实体(Msg)的实体,其中父PK (msg_id)是子实体中的FK时,尝试保持子实体(MsgRetry)时出错。 错误,如:org.hibernate.id.IdentifierGenerationException:试图从null一对一属性分配id 父实体,不需要知道子实体(至少我认为它不需要知道)。一旦子实体被持久化,我就会尝试也持久化父实体。我可以通过在子实体中没有父实体并调用关联

  • 问题内容: 我有一些看起来像这样的Hibernate实体(省略了getter和setter): 当我查询EntityA时,它的加载情况很好,父关联被Hibernate代理(因为它是惰性的)代替了。如果要访问父母的ID,请执行以下调用: 据我了解,该调用不应往返于数据库,因为Id存储在EntityA表中,并且代理应仅返回该值。但是,在我的情况下,这会生成一条SQL语句,该语句将提取EntityB并仅

  • 问题内容: 我有一个简单的jpa实体“ ApplicationForm”,其中有一对多列表: ApplicationForm中包含的变量Dictionary是仅带有问题文本的另一个普通实体。字典映射的相应数据库表为: 我想知道是否可以使用jpa或hibernate建立一个查询,以使用特定语言环境(例如“ it”)的Dictionary检索ApplicationForm实体。使用标准sql可以轻松完

  • 我有生成Hibernate实体的mysql db,现在我需要从这些实体生成内存数据库进行测试。我在试图运行我的单元测试时遇到了这个错误。 /***主]o.h.发动机。jdbc。spi。SqlExceptionHelper:SQL错误:42102,SQLState:42S02 2016-02-16 18:10:47.864错误29758---[main]o.h.engine。jdbc。spi。Sql