質問

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プロバイダは

JPAのHRIFEREATEの実装名前付きパラメータ

ネイティブ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パラメータマップのキーは、単に位置パラメータのインデックスです。

追加のソース

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top