有 Java 编程相关的问题?

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

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()方法获取单个(标量)值,因为如果查询语句意外返回一行或多行,此方法将不必要地引发异常


共 (2) 个答案

  1. # 1 楼答案

    从MySQL 8开始,您不再需要MySQL的特殊语法,因为它现在支持窗口函数。但是,如果没有,您的特定查询始终可以以SQL-92方式重写,而无需使用窗口函数:

    如果您已经知道您的country_id参数存在

    SELECT count(*) FROM country WHERE country_id >= ?
    

    如果不知道country_id参数是否存在

    SELECT count(*)
    FROM country
    WHERE country_id >= ?
    AND ? IN (SELECT country_id FROM country)
    

    如果country_id不是唯一的(我假设它是唯一的),那么翻译就不是完全正确的。如果不是,那么这对应于^{,而不是^{

  2. # 2 楼答案

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

    所以不能用HQL或JPQL模拟这些查询,这意味着必须使用本机查询

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