数据库不可知查询以获取基于主键的行号

时间:2014-12-07 17:51:03

标签: java hibernate jpa orm eclipselink

country成为RDBMS系统中的表。它的列很直观。因此,我不深入,也不需要知道。

在使用JPA(通过EclipseLink / Hibernate)时,我需要在应用程序的许多地方使用以下SQL语句。

MySQL:

SELECT rownum 
FROM   (SELECT @rownum := @rownum + 1 AS rownum, tbl.country_id 
        FROM   country tbl, (SELECT @rownum := 0) t 
        ORDER  BY tbl.country_id DESC)t 
WHERE  country_id =? 

Oracle(使用窗口分析函数):

SELECT row_num 
FROM   (SELECT ROW_NUMBER() 
               OVER (ORDER BY country_id DESC) AS row_num, country_id 
        FROM   country 
        ORDER  BY country_id DESC) 
WHERE  country_id = ?

此本机语句需要通过使用createNativeQuery()方法直接执行,如下所示。

entityManager.createNativeQuery("Above Query")
             .setParameter(1, id)
             .getResultList();

这些语句用于根据使用setParameter()方法设置的给定主键值返回行号。

它们不是数据库不可知的。 JPA中是否存在任何与数据库无关的内容?

我没有使用getSingleResult()方法来获取单个(标量)值,因为如果查询语句无意义地返回任何行或多行,此方法将不必要地抛出异常。 < / p>

1 个答案:

答案 0 :(得分:1)

JPQL和HQL使用的是一种可追溯到SQL-92的简化查询语法。那是因为大多数数据库都符合SQL-92。

因此,您无法使用HQL或JPQL模拟这些查询,这意味着您必须使用本机查询。

要隐藏数据库特定的详细信息,您可以将查询定义为$ db_query_name,然后在运行时提供$ db。