利用Oracle提示,您可以更改Oracle执行计划,以影响Oracle从数据库检索数据的方式。 请转到此处以获取有关Oracle优化器提示的更多详细信息。
在Hibernate中,是否可以将Oracle提示嵌入到Hibernate查询中?
休眠setComment()?
您可以使用Hibernate自定义注释“ setComment() ”功能将Oracle提示嵌入到HQL吗? 我们来看一个例子
1.原始的休眠查询
这是一个简单的选择HQL,可使用股票代码检索股票。
String hql = "from Stock s where s.stockCode = :stockCode";
List result = session.createQuery(hql)
.setString("stockCode", "7277")
.list();
输出量
Hibernate:
select
stock0_.STOCK_ID as STOCK1_0_,
stock0_.STOCK_CODE as STOCK2_0_,
stock0_.STOCK_NAME as STOCK3_0_
from mkyong.stock stock0_
where stock0_.STOCK_CODE=?
2.尝试使用Hibernate setComment()
在Hibernate的配置文件(hibernate.cfg.xml)中启用hibernate.use_sql_comments ,以便将自定义注释输出到日志文件或控制台。
<!-- hibernate.cfg.xml -->
<?xml version="1.0" encoding="utf-8"?>
...
<hibernate-configuration>
<session-factory>
...
<property name="show_sql">true</property>
<property name="format_sql">true</property>
<property name="use_sql_comments">true</property>
<mapping class="com.mkyong.common.Stock" />
</session-factory>
</hibernate-configuration>
使用Hibernate setComment()在查询中插入自定义注释。
String hql = "from Stock s where s.stockCode = :stockCode";
List result = session.createQuery(hql)
.setString("stockCode", "7277")
.setComment("+ INDEX(stock idx_stock_code)")
.list();
输出量
Hibernate:
/* + INDEX(stock idx_stock_code) */ select
stock0_.STOCK_ID as STOCK1_0_,
stock0_.STOCK_CODE as STOCK2_0_,
stock0_.STOCK_NAME as STOCK3_0_
from mkyong.stock stock0_
where stock0_.STOCK_CODE=?
3.这项工作吗?
不是,Hibernate自定义注释有两个问题。
1. Oracle提示必须在“选择”之后而不是之前添加。
Hibernate生成的查询
/* + INDEX(stock idx_stock_code) */ select
正确的方法应该是…
select /*+ INDEX(stock idx_stock_code) */
2. Hibernate将在“ / * +”之间自动添加一个额外的空格。
在Hibernate中,仍然没有将Oracle提示嵌入到Hibernate查询语言(HQL)中的官方方法。
PS谢谢皮特对此作出的贡献。
工作方案
唯一的解决方案是使用Hibernate createSQLQuery方法执行本机SQL语句。
String hql = "/*+ INDEX(stock idx_stock_code) */
select * from stock s where s.stock_code = :stockCode";
List result = session.createQuery(hql)
.setString("stockCode", "7277")
.list();
输出
Hibernate:
/*+ INDEX(stock idx_stock_code) */ select *
from stock s where s.stock_code = ?
更多本机SQL查询示例 。
翻译自: https://mkyong.com/hibernate/how-to-embed-oracle-hints-in-hibernate-query/