让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>
答案 0 :(得分:1)
JPQL和HQL使用的是一种可追溯到SQL-92的简化查询语法。那是因为大多数数据库都符合SQL-92。
因此,您无法使用HQL或JPQL模拟这些查询,这意味着您必须使用本机查询。
要隐藏数据库特定的详细信息,您可以将查询定义为$ db_query_name,然后在运行时提供$ db。