Eclipselink:バッチ読み取りは多くのクエリを作成します

Pavel_K

私はeclipselink2.6.4を使用しており、次のエンティティがあります

@Entity
@Table(name = "articles")
public class Article {

    @Id
    @Column(name = "id")
    private Integer id;

    @Column(name = "title")
    private String title;

    @OneToMany(fetch = FetchType.EAGER,mappedBy = "article")
    @BatchFetch(BatchFetchType.IN)
    private List<Author> authors

    //+ setters and getters
}

@Entity
@Table(name = "authors")
public class Author {

    @Id
    @Column(name = "id")
    private Integer id;

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "articleId")
    private Article article;

    @Column(name = "surname")
    private String surname;

    //+setters and getters
}

そして、これは私が著者と一緒にすべての記事を読むために使用するコードです:

String queryString="SELECT e FROM Article e";
Query query = em.createQuery(queryString);
query.setHint("eclipselink.batch.type", "IN");
query.setHint("eclipselink.batch", "e.authors");
query.setFirstResult(position);
query.setMaxResults(amount);
List<Article> items=query.getResultList();

DBには3つの記事があり、すべての記事に2人の著者がいます。そして、これらはeclipselinkが実行するクエリです。

SELECT id AS a1, title AS a2 FROM articles LIMIT ? OFFSET ? bind => [2 parameters bound]
SELECT id, surname, articleId FROM authors WHERE (articleId IN (?,?,?)) bind => [3 parameters bound]
SELECT id, title FROM articles WHERE (id IN (?,?)) bind => [2 parameters bound]
SELECT id, surname, articleId FROM authors WHERE (articleId = ?) bind => [1 parameter bound]
SELECT id, surname, articleId FROM authors WHERE (articleId = ?) bind => [1 parameter bound]

なぜそんなに多くのクエリ?私は2つのクエリだけを期待しています。私の間違いは何ですか?

編集
私はさらに2つのテストを行いました:

  1. @BatchFetch(BatchFetchType.IN)フィールド作成者のArticleクラスでのみ注釈使用しました(クエリにヒントを追加しませんでした
  2. 注釈は使用しませんでした@BatchFetch(BatchFetchType.IN)が、クエリで2つのヒントを使用しました。

    String queryString = "SELECT e FROM Article e"; クエリクエリ= em.createQuery(queryString); query.setHint( "eclipselink.batch.type"、 "IN"); query.setHint( "eclipselink.batch"、 "e.authors"); query.setFirstResult(0); query.setMaxResults(10); リストitems = query.getResultList();

表記事のデータ:

| id | title    |
-----------------
| 1  | article1 |
| 2  | article2 |
| 3  | article3 |

テーブル作成者のデータ:

| id | articleId |  surname  |
------------------------------
| 1  |  1        |  Author1  |
| 2  |  1        |  Author2  |
| 3  |  2        |  Author3  |
| 4  |  2        |  Author4  |
| 5  |  3        |  Author5  |
| 6  |  3        |  Author6  |

各テストでは、6つのクエリが実行されます。

SELECT id AS a1, title AS a2 FROM articles LIMIT ? OFFSET ? bind => [2 parameters bound]
SELECT id, surname, articleId FROM authors WHERE (articleId IN (?,?,?)) bind => [3 parameters bound]
SELECT id, title FROM articles WHERE (id = ?) bind => [1 parameter bound]
SELECT id, surname, articleId FROM authors WHERE (articleId = ?) bind => [1 parameter bound]
SELECT id, title FROM articles WHERE (id = ?) bind => [1 parameter bound]
SELECT id, surname, articleId FROM authors WHERE (articleId = ?) bind => [1 parameter bound]
Saulius Next

バッチフェッチを設定する方法は2つあります。

  1. オーバーアノテーション @BatchFetch(BatchFetchType.IN)
  2. クエリのヒント query.setHint(QueryHints.BATCH, column); query.setHint(QueryHints.BATCH_TYPE, BatchFetchType.IN);

あなたの場合、Authorテーブルに注釈を追加したようですが、ヒントを使用したクエリテーブルで実行されArticleます。私はこれの背後にある論理全体を知りませんが、私は提案します:

@Entity
@Table(name = "articles")
public class Article {

    @Id
    @Column(name = "id")
    private Integer id;

    @Column(name = "title")
    private String title;

    @OneToMany(mappedBy = "article", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    @BatchFetch(BatchFetchType.IN)
    private List<Author> authors

    //+ setters and getters
} 

@Entity
@Table(name = "authors")
public class Author {

    @Id
    @Column(name = "id")
    private Integer id;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "articleId")
    private Article article;

    @Column(name = "surname")
    private String surname;

    //+setters and getters
}

または

ヒント付きのクエリのみを使用して、そのアノテーションを使用しないでください。

String queryString="SELECT e FROM Article e";
Query query = em.createQuery(queryString);
query.setHint("eclipselink.batch.type", "IN");
query.setHint("eclipselink.batch", "e.authors");
query.setFirstResult(position);
query.setMaxResults(amount);
List<Article> items=query.getResultList();

もう1つ:JPA 2.0仕様から、デフォルトは次のようになります。

OneToMany: LAZY
ManyToOne: EAGER
ManyToMany: LAZY
OneToOne: EAGER

Eclipseリンクは同じものを使用します:

OneToMany: LAZY
ManyToOne: EAGER
ManyToMany: LAZY
OneToOne: EAGER

@OneToManyは(fetch = FetchType.EAGER)である必要があり、@ ManyToOneは(fetch = FetchType.LAZY)である必要があります。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Oracleapexは読み取り専用のブレッドクラムエントリを作成します

分類Dev

シェルスクリプトはどのようにしてバッチテストフォルダのデータを読み取りますか

分類Dev

Hadoopはファイル全体を読み取り、多くのマッパーに送信します

分類Dev

ソケット ストリームから読み取るためのスレッドは、より多くの CPU 使用率を必要とします。

分類Dev

ファイルからマップを読み取るとき、HaskellはPythonよりも多くのメモリを必要とします。どうして?

分類Dev

チャネルは読み取りを遅くしますか?

分類Dev

FileStreamは遅く、高速な方法で多くのファイルの数バイトを読み取ります

分類Dev

バッチスクリプトを使用して、区切られたファイル内の特定の列のみを読み取ります

分類Dev

Javaはファイルディレクトリを読み取り、PDFへのリンクを作成します

分類Dev

Springバッチは、AggregateItemReaderまたは他のソリューションを使用して、リーダーで複数行を一度読み取ります

分類Dev

openglは、読み取り用のdepth_stencilテクスチャを作成します

分類Dev

KafkaフェッチリクエストのIOサイズを読み取ります

分類Dev

チェックボックスの読み取り値は常に0を示します

分類Dev

smb2クライアントがそれよりも多くのクレジットで読み取り要求を発行した場合、サーバーはどのように応答しますか?

分類Dev

多くのスレッドがグローバルメモリ内の特定の場所を同時に読み取る場合、トランザクションはいくつありますか?

分類Dev

MongoDB書き込みロックはセカンダリの読み取りをブロックしますか?

分類Dev

ファイルをバッチ処理してファイルを読み取り、JSONを作成しますか?

分類Dev

アトミック読み取りは最新の値の読み取りを保証しますか?

分類Dev

複数のバッチ読み取りと書き込みを伴うCloudFunctionhttpリクエスト

分類Dev

TensorFlowは画像のバッチを読み取ってデコードします

分類Dev

Cassandra読み取り修復はいつクエリをブロックしますか

分類Dev

読み取り専用クエリ。接続を閉じる必要があります。ロールバック、コミット、または「そのまま」のままにしますか?

分類Dev

ノードのprocess.stdin読み取り可能ストリームは、読み取り可能イベントリスナーコールバック内で読み取られるとNullをログに記録します

分類Dev

AWSglueContextの読み取りはSQLクエリを許可しません

分類Dev

Python telnetlib読み取り関数は、予想よりも多くのデータを返します

分類Dev

Pythonが設定したよりも多くのビットを読み取るのはなぜですか?

分類Dev

コルーチンは、共有リソースの読み取り/書き込み時にロックを必要としますか?

分類Dev

Postgresqlクエリはゆっくりと速く実行されます。説明計画は高い共有読み取りを示しています

分類Dev

バッチファイル-USBを読み取り/書き込みから読み取り専用に、またはその逆に切り替えます。

Related 関連記事

  1. 1

    Oracleapexは読み取り専用のブレッドクラムエントリを作成します

  2. 2

    シェルスクリプトはどのようにしてバッチテストフォルダのデータを読み取りますか

  3. 3

    Hadoopはファイル全体を読み取り、多くのマッパーに送信します

  4. 4

    ソケット ストリームから読み取るためのスレッドは、より多くの CPU 使用率を必要とします。

  5. 5

    ファイルからマップを読み取るとき、HaskellはPythonよりも多くのメモリを必要とします。どうして?

  6. 6

    チャネルは読み取りを遅くしますか?

  7. 7

    FileStreamは遅く、高速な方法で多くのファイルの数バイトを読み取ります

  8. 8

    バッチスクリプトを使用して、区切られたファイル内の特定の列のみを読み取ります

  9. 9

    Javaはファイルディレクトリを読み取り、PDFへのリンクを作成します

  10. 10

    Springバッチは、AggregateItemReaderまたは他のソリューションを使用して、リーダーで複数行を一度読み取ります

  11. 11

    openglは、読み取り用のdepth_stencilテクスチャを作成します

  12. 12

    KafkaフェッチリクエストのIOサイズを読み取ります

  13. 13

    チェックボックスの読み取り値は常に0を示します

  14. 14

    smb2クライアントがそれよりも多くのクレジットで読み取り要求を発行した場合、サーバーはどのように応答しますか?

  15. 15

    多くのスレッドがグローバルメモリ内の特定の場所を同時に読み取る場合、トランザクションはいくつありますか?

  16. 16

    MongoDB書き込みロックはセカンダリの読み取りをブロックしますか?

  17. 17

    ファイルをバッチ処理してファイルを読み取り、JSONを作成しますか?

  18. 18

    アトミック読み取りは最新の値の読み取りを保証しますか?

  19. 19

    複数のバッチ読み取りと書き込みを伴うCloudFunctionhttpリクエスト

  20. 20

    TensorFlowは画像のバッチを読み取ってデコードします

  21. 21

    Cassandra読み取り修復はいつクエリをブロックしますか

  22. 22

    読み取り専用クエリ。接続を閉じる必要があります。ロールバック、コミット、または「そのまま」のままにしますか?

  23. 23

    ノードのprocess.stdin読み取り可能ストリームは、読み取り可能イベントリスナーコールバック内で読み取られるとNullをログに記録します

  24. 24

    AWSglueContextの読み取りはSQLクエリを許可しません

  25. 25

    Python telnetlib読み取り関数は、予想よりも多くのデータを返します

  26. 26

    Pythonが設定したよりも多くのビットを読み取るのはなぜですか?

  27. 27

    コルーチンは、共有リソースの読み取り/書き込み時にロックを必要としますか?

  28. 28

    Postgresqlクエリはゆっくりと速く実行されます。説明計画は高い共有読み取りを示しています

  29. 29

    バッチファイル-USBを読み取り/書き込みから読み取り専用に、またはその逆に切り替えます。

ホットタグ

アーカイブ