ホームページ >Java >&#&チュートリアル >JPA ネイティブ クエリ結果を POJO コレクションに効率的に変換するにはどうすればよいですか?

JPA ネイティブ クエリ結果を POJO コレクションに効率的に変換するにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-09 11:13:061056ブラウズ

How to Efficiently Convert JPA Native Query Results to POJO Collections?

POJO クラスを使用した JPA コレクションのクエリ結果変換の解決

JPA を使用する場合、ネイティブ クエリが結果セットを返すシナリオによく遭遇します。複数の列がある。データを処理するには、この結果セットを POJO クラスのコレクションに変換することが不可欠です。この記事では、この変換を実現するためのさまざまなアプローチについて詳しく説明します。

マップされたエンティティの使用 (JPA 2.0 以降)

JPA 2.0 では、ネイティブ クエリをマップする機能が導入されています。結果を JPA エンティティ クラスに変換します。このアプローチはシンプルで簡単です:

Query query = em.createNativeQuery("SELECT name,age FROM jedi_table", Jedi.class);
List<Jedi> items = (List<Jedi>) query.getResultList();

ただし、このアプローチでは Jedi がマップされたエンティティ クラスである必要があり、これは常に望ましいとは限りません。

手動マッピング

マップされたエンティティの使用が適切でないシナリオでは、手動マッピングに頼ることができます。これには、結果タプルを POJO クラス コンストラクターにマップするユーティリティ メソッドの作成が含まれます。

public static <T> T map(Class<T> type, Object[] tuple) {
    Constructor<T> ctor = type.getConstructor(...); // Using reflection to find the constructor
    return ctor.newInstance(tuple);
}

手動マッピングを使用すると、タプルのリストを POJO コレクションに簡単に変換できます。

Query query = em.createNativeQuery("SELECT name,age FROM jedi_table");
@SuppressWarnings("unchecked")
List<Object[]> records = query.getResultList();
List<Jedi> jedis = new LinkedList<>();
for (Object[] record : records) {
    jedis.add(map(Jedi.class, record));
}

JPA 2.1 と@SqlResultSetMapping

JPA 2.1 は、ネイティブ クエリ結果を POJO クラスにマッピングするより洗練された方法を提供する @SqlResultSetMapping アノテーションを提供します。このアノテーションはエンティティ内で宣言されています:

@SqlResultSetMapping(name="JediResult", classes = {
    @ConstructorResult(targetClass = Jedi.class, 
    columns = {@ColumnResult(name="name"), @ColumnResult(name="age")})
})

このマッピングを使用すると、結果セットを POJO コレクションに直接変換できます:

Query query = em.createNativeQuery("SELECT name,age FROM jedi_table", "JediResult");
@SuppressWarnings("unchecked")
List<Jedi> samples = query.getResultList();

XML マッピングを使用

または、@SqlResultSetMapping アノテーションを定義することもできます。 orm.xml ファイルをエンティティ クラスの外に置きます:

<named-native-query name="GetAllJedi" result-set-mapping="JediMapping">
    <query>SELECT name,age FROM jedi_table</query>
</named-native-query>

<sql-result-set-mapping name="JediMapping">
    <constructor-result target-class="org.answer.model.Jedi">
        <column name="name" class="java.lang.String" />
        <column name="age" class="java.lang.Integer" />
    </constructor-result>
</sql-result-set-mapping>

この XML マッピングを使用すると、次のように変換を実行できます:

Query query = em.createNativeQuery("GetAllJedi");
@SuppressWarnings("unchecked")
List<Jedi> samples = query.getResultList();

これらの各アプローチには次のような特徴があります。それ自体の長所と短所。適切な方法の選択は、アプリケーションの特定の要件と制約によって異なります。

以上がJPA ネイティブ クエリ結果を POJO コレクションに効率的に変換するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。