java数据库不可知查询,根据主键获取行号
设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()
方法获取单个(标量)值,因为如果查询语句意外返回一行或多行,此方法将不必要地引发异常
# 1 楼答案
从MySQL 8开始,您不再需要MySQL的特殊语法,因为它现在支持窗口函数。但是,如果没有,您的特定查询始终可以以SQL-92方式重写,而无需使用窗口函数:
如果您已经知道您的
country_id
参数存在如果不知道
country_id
参数是否存在如果,而不是^{
country_id
不是唯一的(我假设它是唯一的),那么翻译就不是完全正确的。如果不是,那么这对应于^{# 2 楼答案
JPQL和HQL使用的是一种简化的查询语法,可以追溯到SQL-92。这是因为大多数数据库都符合SQL-92
所以不能用HQL或JPQL模拟这些查询,这意味着必须使用本机查询
要隐藏特定于数据库的详细信息,可以将查询定义为$db_query_name,然后在运行时简单地提供$db