1

谁能帮我将以下用于获取分页结果的 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 的内存中进行。(对于 JOIN FETCH HQL 查询的 Query.setMaxResults、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;
}
4

1 回答 1

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" ...
于 2012-11-16T09:35:36.620 回答