如何在Hibernate查询中嵌入Oracle提示

利用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/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值