有人可以帮助我将以下用于获取分页结果的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;
}
答案 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" ...