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 别名的提示,因此我需要知道如何:
juris
而不是 jurisdicti4_
来表示 jurisdiction
,或 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 通常会根据映射添加自己的映射,我不确定如何对这些映射进行相同级别的部分控制。
Hibernate 没有提供一种直接的方法来直接指定它应该使用的表别名或检索它将用于特定实体的确切别名。 您可以尝试以下一些方法:
实现自定义
AliasStrategy
并将其设置在 Hibernate 配置中。
configuration.setImplicitAliasStrategy(new YourCustomAliasStrategy());
使用
Criteria
API时,您可以使用alias方法为实体设置别名。
Criteria criteria = session.createCriteria(YourEntity.class, "aliasName");
或者继续使用 Native SQL。