【问题标题】:java persistance query language limit resultsetjava持久化查询语言限制结果集
【发布时间】:2011-08-03 20:08:17
【问题描述】:

假设我在表“mytable”中有以下行 身份证

1

2

3

... ...

500

我的查询就像select m from mytable m where m.id < 300 如何以相同的顺序获得以下输出?

201

202

... ... ...

299

我正在使用 setMaxResult(100) 但它会返回这样的输出

1

2

... ...

100

有什么建议吗?

【问题讨论】:

  • 请查看您的查询,您希望 id 小于 300 或大于 200
  • 如果他想要在特定 id 范围内拥有数据集,并且在该范围内使用所有 id 都没有关系,那么是的,这应该是最简单的方法 (... where m.id between 201 and 299)。

标签: java mysql jpql


【解决方案1】:
String ql = "select m from mytable m where m.id < 300 order by m.id";
Query query = em.createQuery(ql);
query.setFirstResult(200);
query.setMaxResults(100);

【讨论】:

    【解决方案2】:

    您可以使用setFirstResult 来定义起始索引。与setMaxResult 一起可以获得特定范围。

    【讨论】:

    • 是的,但是 where 子句中的值是动态的。所以我不知道从哪里开始。有一种方法可以先计算行数,然后发出新查询,但我正在尝试找到更好的方法(如果存在)
    • 我认为没有一种很好的动态方式来定义一个查询中的范围。如果您想要前 100 个,只需使用setMaxResults(100),如果您想要后 100 个使用相反的顺序并取前 100 个。如果您想在两者之间获得另一个范围,则必须以某种方式知道该数字结果。您可能能够以某种方式获得结果数量并在一个 SQL 查询中计算范围,但我很确定这在 JPQL 中是不可能的。您能否提供有关您需要的上下文的更多信息?
    • 我在一个表中有 10K 行,我正在将此表与 jtable 绑定,其中显示前 100 行。我还在 gui 中包含了 2 个按钮来导航结果集,即下一个,上一个,当用户单击下一个按钮时,我会得到最后一行表格,其中也写入了 ID。然后我进行下一个查询以从 > 获取结果,而不是从最后一行获取结果,这很好。现在我正试图返回我需要上述查询的地方。你知道如何实现这个分页功能
    • 在一般情况下,您只需先选择结果数(没有任何最大值),然后使用 setFirstResultsetMaxResult 进行分页(您必须分配每个页面一个范围)。如果您的数据可能在两者之间发生变化,您可以再次检查数据集的数量(这应该很快)或将where m.id &gt; xsetMaxResult 结合使用。然后应该为按钮分配 x 的值(您应该加载 100 + 1 个条目以便下一页的 x,应该已经知道 pev 按钮的 x,因为我假设你加载该页面一次)。
    【解决方案3】:

    如果你正在学习JPA,你可以使用order by

    直接在您的 JPA 查询中:

    select m from mytable m where m.id < 300 order by m.id
    

    或者使用criteria:

    CriteriaQuery<MyTable> q = cb.createQuery(MyTable.class);
    Root<MyTable> c = q.from(MyTable.class);
    q.select(c);
    q.orderBy(cb.asc(c.get("id")));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-17
      • 1970-01-01
      • 1970-01-01
      • 2023-03-09
      • 2011-09-28
      • 1970-01-01
      相关资源
      最近更新 更多