0

私が持っているのは、ID の大きな (数十万のような) リストです。JPA クエリを使用して、この ID を持つオブジェクトからいくつかの値を取得したいと考えています。

オプション 1 - IN 句を使用する

List<Long> ids = /* ... */
entityManager.createQuery(
        "SELECT v.lat, v.lon FROM Vehicle v WHERE v.id IN (:ids)",
        Long[].class)
    .setParameter("ids", ids)
    .getResultList();

IN条項の内容に制限があるかもしれません。

オプション 2 - 各 ID を個別にクエリする

List<Long> ids = /* ... */
for (Long id : ids) {
    entityManager.createQuery(
            "SELECT v.lat, v.lon FROM Vehicle v WHERE v.id = :id",
            Long[].class)
        .setParameter("id", id)
        .getSingleResult();
}

リクエストを行っているように見えるので、それは遅すぎids.size()ます。

この種のことを行う適切な方法は何ですか?

4

2 に答える 2

1

あなたの方法はどちらもあまりメリットがありません。Grzegorz のコメントで述べたように、すべてのデータベースには、使用できるリスト アイテムの数に制限があります。また、クエリに含めることができる文字数にも制限があります。だからリストが出ています。

何十万もの個別のクエリは賢明ではないようです (ダンの投稿ガイドラインを思い出してください、礼儀正しくしてください)。

これが私の問題である場合、最初に ID のリストがどのように生成されたかを調べます。おそらくデータベースクエリでした。もしそうなら、そのクエリの新しいバージョンを作成して、緯度と経度を取得します。それは、テーブルの結合であるか、サブクエリである可能性があります。データベースの構造を知らなければ、詳細な提案をすることはできません。

于 2013-02-08T14:39:23.003 に答える
-1

最初に頭に浮かぶこと:

  1. id リストを 1000 個の id の部分に分割します。扱いやすいサイズ。
  2. 各パーツに対して IN クエリを実行します。
  3. 結果をリストに集約します。

大きなデータ セットの場合、(2) を並列に実行することで、パフォーマンスを大幅に向上させることができます。

于 2013-02-08T14:34:36.577 に答える