当前位置: 首页 > 知识库问答 >
问题:

EclipseLink分页和Oracle ROWNUM

殳凯捷
2023-03-14

使用带有规范和分页的Eclipse Link JPA 2.5.2,我对Oracle ROWNUM的执行方式有问题。Eclipse Link生成的查询如下:

  SELECT *
  FROM (SELECT a.*,
               ROWNUM rnum
          FROM (SELECT   t0.ID,
                         t0.participantidentity_id,
                         t0.submitteddate
                    FROM delegation t4,
                         meeting t3,
                         meetinggroup t2,
                         participantidentity t1,
                         reimbursement t0,
                         userdata ud
                   WHERE t0.current_id IS NULL
                     AND t1.activeparticipant_id IS NOT NULL
                     AND t2.responsibleservice_id IN (74)
                     AND t1.ID = t0.participantidentity_id
                     AND t4.ID = t1.delegation_id
                     AND t3.ID = t4.meeting_id
                     AND t2.ID = t3.meetinggroup_id
                     AND t1.userdata_id = ud.ID
                ORDER BY t0.submitteddate ASC) a
         WHERE ROWNUM <= 25)
 WHERE rnum > 0

为第一页运行该查询应返回0到25之间的行,为第二页运行相同的查询应返回25到50之间的行。

问题是第一页的记录也出现在第二页,我猜是因为submitteddate可以包含NULL值并且ORDER BY子句在ROWNUM和rnum条件或类似的东西之前没有应用,我不确定,因为我现在有点困惑...

谁能解释一下原因吗?

谢啦!

共有1个答案

濮阳立果
2023-03-14

我根据上面的场景做了一些测试--

CREATE TABLE T3(AA NUMBER(10),BB NUMBER(10),CC NUMBER(10),DD NUMBER(10));
INSERT INTO T3 VALUES (1,2,3,null);
INSERT INTO T3 VALUES (4,5,6,13);
INSERT INTO T3 VALUES (7,8,9,NULL);
INSERT INTO T3 VALUES (10,11,12,14);

然后--

 SELECT *
FROM
  (SELECT
    a.*,
    rownum rnum
  FROM
    (SELECT aa AS a1,
      bb   AS a2,
      CC          AS A3,
      dd as a4
    FROM T3
    ORDER BY DD ASC) A
  WHERE ROWNUM <= 2
  )
WHERE rnum > 0;

此测试永远不会返回重复项。

所以请执行您下面的查询

SELECT   t0.ID,
                             t0.participantidentity_id,
                             t0.submitteddate
                        FROM delegation t4,
                             meeting t3,
                             meetinggroup t2,
                             participantidentity t1,
                             reimbursement t0,
                             userdata ud
                       WHERE t0.current_id IS NULL
                         AND t1.activeparticipant_id IS NOT NULL
                         AND t2.responsibleservice_id IN (74)
                         AND t1.ID = t0.participantidentity_id
                         AND t4.ID = t1.delegation_id
                         AND t3.ID = t4.meeting_id
                         AND t2.ID = t3.meetinggroup_id
                         AND t1.userdata_id = ud.ID
                    ORDER BY t0.submitteddate ASC

并检查是否有任何副本。

此外,尝试在sql开头使用distinct关键字,如选择distinct t0。ID

 类似资料:
  • 问题内容: 我有一个问题,我无法解决。在hibernate状态下,我没有以下问题: 然后在我的schema.ddl中,我有这个: 这里没什么可看的。一切正常。但是,如果我将提供程序切换到EclipseLink,则会出现此错误: 因此,我当然会四处搜索,如果初始值为1且它应该等于分配大小,那么我会看到有关EclipseLink创建负数的一些信息。 因此,好的,因此添加“ initialValue =

  • EclipseLink有可能和夸库斯一起使用吗?还是夸库斯太难与Hibernate耦合了? 我们正在选择我们的MP实现的过程中,我们希望尽可能接近参考信息 我在https://quarkus.io/guides/甚至这个论坛上都没有看到太多信息来表明eclipselink也可以与Quarkus一起使用。 任何关于夸库斯为什么与JPA的一个特定的impl(如果是的话)绑得如此紧密的指示也将是受欢迎的

  • 我可以使用Hibernate,但我正在尝试更改为Eclipselink。我一直在寻找解决办法,但没有结果。人们建议把这两个(不是放在一起) persitence.xml 应用程序-context.xml 错误

  • 我正在将一个旧的IBM Process Server应用程序移植到IBM WebSphere Liberty。它包含大量基于服务数据对象(SDO)的代码。我有一些很好的工作代码,作为独立的Java运行,使用JDK8。我使用的是eclipselink 2.7.7,特别是两个jar文件; 我已经将此代码构建到一个Servlet中以处理SOAP请求,并将其与其他代码一起打包到一个EAR文件中,我将其部署

  • RSS功能 Django是一个全面型框架, 很多功能都可以直接找到, 对于RSS功能, 可以从其中的高层框架的聚合Feed框架中找到(The syndication feed framework) 上层Feed生成框架可以直接应用Feed类, 我们可以直接继承Feed在其中定义自己的方法 在my_blog/article/views.py中定义类 from django.contrib.s

  • 分页: 用户程序的地址空间被划分成若干固定大小的区域,称为“页”,相应地,内存空间分成若干个物理块,页和块的大小相等。可将用户程序的任一页放在内存的任一块中,实现了离散分配。 分段: 将用户程序地址空间分成若干个大小不等的段,每段可以定义一组相对完整的逻辑信息。存储分配时,以段为单位,段与段在内存中可以不相邻接,也实现了离散分配。 分页与分段的主要区别 页是信息的物理单位,分页是为了实现非连续分配