java如何在Hibernate中使用Oracle/*+PARALLEL(4)*/
我知道这是一个重复的问题,但我无法在Hibernate会话中找到Oracle查询提示的实现
下面是我的Spring引导服务的简化版本 一,道班,, 2.响应课堂, 3.查询。sql
尽管我在Query中提供了查询提示。sql、hibernate无法更快地运行查询。同样的查询在sqldeveloper中运行得更快。我不知道为什么Hibernate不考虑提示^ {CD1>}/P>
查询的内容。sql
SELECT /*+PARALLEL(4)*/
cust_id,
name
FROM cust_table
WHERE is_active='Y'
课堂内容
@Repository("DAOClass")
@Transactional(value = "JpaTxnManager", propagation = Propagation.REQUIRED)
public class DAOClass
{
EntityManager entityManager;
String queryString = readFromSqlFile(query.sql)
Query query = entityManager.createNativeQuery(queryString, ResponseClass.class)
List<ResponseClass> responseClassList = query.getResultist()
}
响应类的内容
@Entity
public class ResponseClass
{
@Id
@Column(name = "cust_id")
private String custId;
@Column(name = "name")
private String name;
//getter-setter methods
}
我读过关于投影的文章,但我的实现完全不同。 我想要的东西,很容易在我现有的项目实施
我没有像here那样的query.setComment()
选项
我还检查了mkyong的执行情况。但这和我的方法不同
如何使/*+PARALLEL(4)*/
在上面的Hibernate和spring代码中工作
# 1 楼答案
在四处挖掘并尝试了一系列不同的建议后,我终于找到了一个有效的解决方案(至少对我来说是这样)。您需要获得对本机查询的Hibernate查询类的访问权限,并在此时添加查询提示。例如,原始示例应该如下所示:
在我最初的评论中,我注意到指定结果对象的类显然会导致忽略索引。从那以后,我确定这不是全部。在我的特殊情况下,强制使用索引将我的查询减少到107ms。然而,查询返回的结果太多,以至于将每一行转换为我指定的类的实例的过程又花了16秒! 因此,即使添加了提示,实际收益也可能没有预期的那么大(例如,在SQL Developer中执行时)
如果将以下hibernate属性添加到
persistence.xml
(或使用hibernate.properties
文件)并使用setHint()
方法向查询中添加hibernate注释,则可以(非常多!)更容易准确地看到正在执行的操作,并确定您的特定选择: