HQL相当于SQL分页查询

时间:2012-11-16 08:40:15

标签: sql hibernate hql

有人可以帮助我将以下用于获取分页结果的SQL查询转换为HQL吗?

SELECT *
FROM REPORDER repairorde0x_
INNER JOIN REPREPAIRDEVICE repairdevi1x_
ON repairorde0x_.ID=repairdevi1x_.REPORDERID
WHERE repairorde0x_.ID IN
    (SELECT id
    FROM
       (SELECT row_.id,
       rownum rownum_
       FROM
          (SELECT DISTINCT repairorde0_.ID
          FROM REPORDER repairorde0_
          INNER JOIN REPREPAIRDEVICE repairdevi1_
          ON repairorde0_.ID=repairdevi1_.REPORDERID
          ) row_
       WHERE rownum <= 550
       )
    WHERE rownum_ > 500
    ) ;

我无法转换为HQL的部分是子选择,其中选择了要获取的修复订单的ID。 我不知道在这种情况下如何处理rownum和几个后续的子选择语句。

我需要HQL查询才能在数据库级别进行分页,而不是在Java内存中进行分页。 (Query.setMaxResults,JOIN FETCH HQL查询的Query.setFirstResult问题警告:“使用集合提取指定firstResult / maxResults;在内存中应用!”)

只是提示实体的Java模型:

class RepairOrder{
    private int id;
    private String orderNumber;
    private List<RepairDevice> repairDevices;
}

class RepairDevice{
    private int id;
    private int repairOrderId;
    private String deviceName;
}

1 个答案:

答案 0 :(得分:2)

最简单的方法是只修改修理订单并使用其他查询加载设备,使用批量大小来避免N + 1:

orders = session
  .CreateQuery("from RepairOrder")
  .SetFirstResult(500)
  .SetMaxResult(50);

此xml映射将一次加载设备50个订单(使1 + N为1 +(N / 50))。

<bag name="RepairDevices" batch-size="50" ...