java - Hibernate 延迟初始化集合,带有 Oracle DB 提示

标签 java sql oracle hibernate hints

我有带有延迟初始化集合的实体:

SomeEntity someEntity = template.findByNamedQuery("queryName", entityId);
if (someEntity != null) {
    Hibernate.initialize(someEntity.getChildCollection());
}

Hibernate生成SQL:

SELECT 
  t.COL1 AS COL1_,
  t.COL2 AS COL2_,
  ...
  t.COLN AS COLN_
FROM SCHEMA.TABLE t
WHERE t.COLX = :1
ORDER BY t.COL1 ASC;

列 COLX 上有索引 IDX_COLX。

但由于某种未知的原因,有时 Oracle 不使用该索引,而是对表使用全扫描。我不控制数据库,但(数据库管理员)告诉我,解决此问题的方法是传递 Oracle 提示。

类似这样的事情:

SELECT /*+ index(t IDX_COLX) */
  t.COL1 AS COL1_,
  t.COL2 AS COL2_,
  ...
  t.COLN AS COLN_
FROM SCHEMA.TABLE t
WHERE t.COLX = :1
ORDER BY t.COL1 ASC;

是否有任何简单的方法可以强制 Hibernate 将此附加信息附加到生成的 SQL 查询中? 我不想因为某些 Oracle 错误或配置错误而重写整个应用程序。

我使用hibernate 3.3.2。

编辑:

我尝试了 StuPointerException 给出的解决方案,生成的 SQL 如下所示:

/*+ index(t IDX_COLX) */
SELECT
  t.COL1 AS COL1_,
  t.COL2 AS COL2_,
  ...
  t.COLN AS COLN_
FROM SCHEMA.TABLE t
WHERE t.COLX = :1
ORDER BY t.COL1 ASC;

在 Oracle SQL Developer 中进行了测试,如果放在 SELECT 语句之前,Oracle 似乎无法识别此提示。

最佳答案

您可以通过在 HibernateSessionFactory 上启用属性 use_sql_comments 来实现此目的:

<property name="use_sql_comments">true</property>

然后您将能够执行以下操作:

String hql = "from SomeEntity e where e.COLX = :colx";
List result = session.createQuery(hql)
        .setString("colx", "xyz")
        .setComment("+ index(t IDX_COLX)")
        .list();

这确实意味着您必须更多地控制代码中的关系,这有点痛苦。

祝你好运!

关于java - Hibernate 延迟初始化集合,带有 Oracle DB 提示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23805135/

相关文章:

迁移到 Wildfly 8.1 时出现 Javax 验证异常

java - 从 xml 列表中获取平均值

java - requestWindowFeature(Window.FEATURE_NO_TITLE);不工作

php - 如何防止 PHP 中的 SQL 注入(inject)?

sql - 在 Oracle 中保持表同步

基于Oracle的SQL查询

java - 需要解析 LinkedList 下存在的 JSON 对象并计算字段值

mysql - 我可以将这些查询压缩成 less

mysql - 如何将一个表中的两个元组连接到另一个表中的一个元组

sql - 使用 string_to_array() 将 Oracle 转换为 PostgreSQL 查询