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 とそれに続くいくつかの sub-select ステートメントを処理する方法がわかりません。

Javaでメモリ内でページネーションを行うのではなく、DBレベルでページネーションを行うには、HQLクエリが必要です。(Query.setMaxResults、Query.setFirstResult JOIN FETCH HQL クエリの警告に関する問題: 「コレクション フェッチで指定された 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 に答える