如何控制 Hibernate 在生成的查询中使用的 SQL 表别名?

问题描述 投票:0回答:1

tl;dr: Hibernate 在其查询中自动生成 SQL 表别名,如

jurisdicti4_
this_
。这是一个示例查询:

SELECT
    this_.id                            AS id2_6_3_,
    this_.a_table_column                AS a_table_column3_6_3_,
    jurisdicti4_.b_table_column         AS b_table_column4_6_3_,
    
FROM
    app_table_a          this_
    LEFT OUTER JOIN jurisdiction       jurisdicti4_ ON this_.jurisdiction = jurisdicti4_.name
WHERE
    this_.a_table_column = ?

我正在使用 Hibernate Criteria API 添加一些需要在查询中引用 SQL 别名的提示,因此我需要知道如何:

  1. 指定 Hibernate 将在其查询中使用的 SQL 表别名(例如,告诉它使用
    juris
    而不是
    jurisdicti4_
    来表示
    jurisdiction
    ,或
  2. 让 hibernate 告诉我它将用于特定表或实体的确切 SQL 表别名(例如,被告知
    jurisdiction
    查询中的别名将是
    jurisdicti4_

全文:

我继承了一个带有 Oracle DB 的 Java 应用程序,该应用程序使用 Hibernate 4.3.8 和 Hibernate Criteria API 来生成一些复杂的搜索查询。它最近遇到了严重的 SQL 性能问题,需要我们开始在这些查询中包含提示。然而,我们使用的是Oracle,它的索引提示的形式是:

/*+ index (TABLE_ALIAS INDEX_NAME) */

我已经使用

Criteria.addHint(...)
成功添加了所需的提示,但是我必须在提示字符串中对 Hibernate 生成的
TABLE_ALIAS
进行硬编码。我担心随着时间的推移,别名可能会发生变化,因此我想控制它们的生成方式,或者能够检索它们的值以在添加 SQL 提示时使用。


编辑:该网站描述了 Hibernate SQL 别名生成过程:https://prismoskills.appspot.com/lessons/Hibernate/Chapter_23_-_Hibernate_alias_names.jsp

我发现当我像这样以编程方式设置连接时,我对 SQL 别名有部分控制:

criteria.createAlias(associationPath, alias)
。我传递的
alias
值似乎用作表的 SQL 别名的第一部分。然而,Hibernate 会附加某种生成的表 ID 整数,因此我会在生成的 SQL 中得到类似
myalias4_
的内容。另外,这似乎只适用于我在标准中设置的连接。 Hibernate 通常会根据映射添加自己的映射,我不确定如何对这些映射进行相同级别的部分控制。

sql oracle hibernate hibernate-criteria
1个回答
0
投票

Hibernate 没有提供一种直接的方法来直接指定它应该使用的表别名或检索它将用于特定实体的确切别名。 您可以尝试以下一些方法:

实现自定义

AliasStrategy
并将其设置在 Hibernate 配置中。

configuration.setImplicitAliasStrategy(new YourCustomAliasStrategy());

使用

Criteria
API时,您可以使用alias方法为实体设置别名。

Criteria criteria = session.createCriteria(YourEntity.class, "aliasName");

或者继续使用 Native SQL。

© www.soinside.com 2019 - 2024. All rights reserved.