有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    在四处挖掘并尝试了一系列不同的建议后,我终于找到了一个有效的解决方案(至少对我来说是这样)。您需要获得对本机查询的Hibernate查询类的访问权限,并在此时添加查询提示。例如,原始示例应该如下所示:

    Query query = entityManager.createNativeQuery(queryString, ResponseClass.class)
                           .unwrap(org.hibernate.query.Query.class)
                           .addQueryHint("PARALLEL(4)");
    

    在我最初的评论中,我注意到指定结果对象的类显然会导致忽略索引。从那以后,我确定这不是全部。在我的特殊情况下,强制使用索引将我的查询减少到107ms。然而,查询返回的结果太多,以至于将每一行转换为我指定的类的实例的过程又花了16秒! 因此,即使添加了提示,实际收益也可能没有预期的那么大(例如,在SQL Developer中执行时)

    如果将以下hibernate属性添加到persistence.xml(或使用hibernate.properties文件)并使用setHint()方法向查询中添加hibernate注释,则可以(非常多!)更容易准确地看到正在执行的操作,并确定您的特定选择:

    hibernate.show_sql=true
    hibernate.format_sql=true
    hibernate.use_sql_comments=true
    
    Query query = entityManager.createNativeQuery(queryString, ResponseClass.class)
                           .setHint("org.hibernate.comment", "ADDING QUERY HINT")
                           .unwrap(org.hibernate.query.Query.class)
                           .addQueryHint("PARALLEL(4)");