如何在Hibernate中使用Oracle查询提示

4

我要使用Hibernate中的Oracle提示来调用force索引,但是在Hibernate 3.6.10.Final中没有找到任何合适的API。

我尝试使用Hibernate Criteria中的投影:

proList.add(Projections.sqlProjection("/*+ INDEX_DESC(CONTACT_USER_FK_I) */", new String[]{}, new Type[]{}));
                proList.add(Projections.property("objectId"));
                criteria.setProjection(proList);
                return criteria.list();

但是我遇到了下面的异常:
    EXCEPTION
Caused by: 8 SQL Error  (could not execute query; SQL [select /*+ INDEX_DESC(CONTACT_USER_FK_I) */, this_.CONTACT_ID as y0_ from R4GDEV01_MBW.CONTACT this_ w
here this_.USER_ID=? and this_.ADDRESS_BOOK_ID in (?) and this_.DELETION_DATE is null order by lower(this_.FIRSTNAME) asc]; nested exception is org.hibernate
.exception.SQLGrammarException: could not execute query)
        at com.fusionone.pml.dao.hibernate.AbstractDao.executeCallback(AbstractDao.java:391)
        at com.fusionone.pml.dao.hibernate.AbstractContactDao.searchContacts(AbstractContactDao.java:1019)
        at com.fusionone.nab.core.service.impl.MergeServiceImpl.getFilteredContactIds(MergeServiceImpl.java:154)
        ... 91 more

我发现投影在查询提示后附加了一个,

在Hibernate 3.6.10标准或HQL中,是否有其他使用Oracle查询提示的方法?

谢谢。


有没有其他方法可以使用Oracle提示而不是在代码中硬编码索引,例如我们是否可以从Hibernate属性文件中实现它。 - Santosh
2个回答

4

首先应该尝试进行搜索。 这里 有一个简单的技巧可以解决这个问题,只需将提示转换成列:

"/*+ INDEX_DESC(CONTACT_USER_FK_I) */ 1 as MYHINT"

非常感谢您的快速响应,这解决了问题。 - Santosh

1
你的问题在于,之前没有任何内容。由于你想在objectId属性上添加一个投影,所以你需要将你的条件转换为类似以下的形式:
Projections.sqlProjection("/*+ INDEX_DESC(CONTACT_USER_FK_I) */ objectId", new String[]{}, new Type[]{}))

谢谢,我已经解决了问题。除了在代码中硬编码索引外,是否有其他使用Oracle提示的方法?例如,我们是否可以从Hibernate属性文件中实现它? - Santosh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接