JPA 2.0では、EntityManager.createnativeQuery()を使用して、ネイティブSQLステートメントを実行できます。ただし、クエリの結果に対応するエンティティクラスがない場合、query.getResultList()はlist <object []>を返します。つまり、各行のデータはオブジェクト配列として返されます。
一般的な使用法はこれです:
public void testnativeQuery(){query query = entitymanager.createnativequery( "select id、name、age from t_user"); list rows = query.getResultList(); for(object row:rows){object [] cells =(object [])row; system.out.println( "id =" + cells [0]); System.out.println( "name =" +セル[1]); System.out.println( "age =" +セル[2]); }}これにより、コードを理解するのが非常に困難になります。 0の添え字を持つ要素とは正確には何ですか?クエリステートメントをカウントしないかどうかは不明です。さらに、クエリステートメントが調整されると、Javaコードも一緒に調整する必要があります。この時点で、マップが返された場合、使用するのがはるかに明確になると考えています。
残念ながら、JPAのAPIはそのような設定を提供しません。実際、多くの基礎となるJPA実装は、マップオブジェクトの返却をサポートしています。
例えば:
eclipselinkのquery.sethint(queryhints.result_type、resulttype.map); hibernate's .setresulttransformer(transformers.alias_to_entity_map);
したがって、マップを返して、基礎となるレイヤーが特定のJPA実装を使用していることを判断したい場合は、次のステップを踏み出し、必要に応じて補充機能を犠牲にすることができます。
public void testnativeQuery(){query query = entitymanager.createnativequery( "select id、name、age from t_user"); query.unwrap(sqlquery.class).setresulttransformer(transformers.alias_to_entity_map); list rows = query.getResultList(); for(object obj:rows){map row =(map)obj; System.out.println( "id =" + row.get( "id")); System.out.println( "name =" + row.get( "name")); System.out.println( "age =" + row.get( "age")); }}クエリは、指定されたエンティティリターンタイプの書き込み方法を返します
クエリquery = entitymanager.createnativequery( "select id、name、age from t_user"、user.class);
ここでは、MAPの使用はオブジェクトアレイを使用するよりも間違いなく効率が低いことに注意する必要があります。したがって、パフォーマンスの低下が許容範囲内にあるかどうかを確認する必要があります。次に、私の冬眠4.2.x環境では、在来のSQLに大文字であろうと小文字に関係なく、返されたフィールド名が大文字になります。もちろん、結果Transformerをカスタマイズして、特定の方法でフィールド名を処理したり、必要なPojoを返すこともできます。
JPAのクエリクエリインターフェイスリターンマップオブジェクトをQuery Query Query Query Queryのメソッドは、私が共有するすべてのコンテンツです。参照を提供できることを願っています。wulin.comをもっとサポートできることを願っています。