JPAの準備済みステートメントの使用方法
-
21-12-2019 - |
質問
Play Frameworkアプリケーション開発者です.JPAでCreateAniveQueryメソッドを使用しています。この例では、準備済みステートメントを使用したいです。誰もが私を助けてください。 これがJPAなしのコードです。私はそれを準備された声明に変換するのに助けが必要です。
Query query = JPA.em().createNativeQuery("select count(*) from truck t inner join" +
"box b where t.truck_id=b.truck_id and t.shipment_upc='" + code + "'");
BigInteger val = (BigInteger)query.getSingleResult();
System.out.println(val);
. 解決
Query query = JPA.em().createNativeQuery("select count(*) from truck t inner join box b where t.truck_id=b.truck_id and t.shipment_upc=:code");
query.setParameter("code", code);
. 他のヒント
簡単な要約
ここでクエリパラメータを使用する必要がありますが、ネイティブクエリを使用しているため、JPQLと比較してオプションが制限されることがあります。
世界の状態
JPAはネイティブクエリをサポートしていませんが、名前付きパラメータをサポートしていませんが、一部のJPAプロバイダは
ネイティブSQLクエリのサポート位置と名前付きパラメータ
溶液
休止状態
Subir Kumar Saoの答え名前付きパラメータを使用してこれを解決してください。これは少なくとも休止状態で可能です。
比較のためにここでそれを繰り返す:
Query query = JPA.em().createNativeQuery(
"SELECT COUNT(*) "+
"FROM truck AS t "+
"INNER JOIN box b "+
"WHERE t.truck_id = b.truck_id "+
"AND t.shipment_upc = :code"
);
query.setParameter("code", code);
.
汎用JPA(EclipseLinkを含む)
EclipsELink(2.5.1)では、名前付きパラメータはサポートされていませんでした。
代わりに、位置パラメータを使用する必要があります。これらは2つの方法で表現できます - 明示的かつ暗黙的に。
明示的な索引
?1
(または他の数の数)を使用してパラメータをマークします。このインデックスは、クエリ内の特定のパラメータを一意に識別するために使用できます。
Query query = JPA.em().createNativeQuery(
"SELECT COUNT(*) "+
"FROM truck AS t "+
"INNER JOIN box b "+
"WHERE t.truck_id = b.truck_id "+
"AND t.shipment_upc = ?1"
);
query.setParameter(1, code);
.
暗黙の索引
?
だけでパラメータをマークします。そのインデックスは、クエリ文字列に参加しているすべてのパラメータのシーケンスに基づきます。
Query query = JPA.em().createNativeQuery(
"SELECT COUNT(*) "+
"FROM truck AS t "+
"INNER JOIN box b "+
"WHERE t.truck_id = b.truck_id "+
"AND t.shipment_upc = ?"
);
query.setParameter(1, code);
.
注意事項
それを観察する:
- 位置パラメータは1インデックスされています。
-
Query
パラメータマップのキーは、単に位置パラメータのインデックスです。
追加のソース
所属していません StackOverflow