文字列に ID のリストがあり、Hibernate を使用してこれらの ID を持つ行を取得したいと考えています。はTrackedItem
Hibernate/JPA エンティティです (名前が混同されている場合は申し訳ありません)。
私のコードは次のとおりです:
String idsText = "380, 382, 386";
ArrayList<Long> ids = new ArrayList<Long>();
for (String i : idsText.split(","))
{
ids.add(Long.getLong(i));
}
List<TrackedItem> items = TrackedItem.find("id IN (?)", ids).fetch();
しかし、それは失敗します:JPAQueryException occured : Error while executing query from models.TrackedItem where id IN (?): java.util.ArrayList cannot be cast to java.lang.Long
どうすれば部品を動作させることができますかIN
? ありがとうございます。
ベストアンサー1
JPQL クエリの構文が正しくありません。次のいずれかを使用します (位置パラメータを使用):
List<Long> ids = Arrays.asList(380L, 382L, 386L);
Query query = em.createQuery("FROM TrackedItem item WHERE item.id IN (?1)");
query.setParameterList(1, ids)
List<TrackedItem> items = query.getResultList();
または(名前付きパラメータを使用):
List<Long> ids = Arrays.asList(380L, 382L, 386L);
Query query = em.createQuery("FROM TrackedItem item WHERE item.id IN :ids");
query.setParameterList("ids", ids)
List<TrackedItem> items = query.getResultList();
以下は、パラメータに関する JPA 1.0 仕様の関連セクションです。
4.6.4.1 位置パラメータ
位置パラメータには次のルールが適用されます。
- 入力パラメータは、疑問符 (?) のプレフィックスとそれに続く整数で指定されます。例:
?1
.- 入力パラメータには 1 から始まる番号が付けられます。
クエリ文字列内で同じパラメータを複数回使用することができ、クエリ文字列内でのパラメータの使用順序は位置パラメータの順序に従う必要がないことに注意してください。4.6.4.2 名前付きパラメータ
名前付きパラメータは、先頭に「:」記号が付いた識別子です。これは、セクション 4.4.1 で定義されている識別子の規則に従います。名前付きパラメータでは大文字と小文字が区別されます。
例:
SELECT c FROM Customer c WHERE c.status = :stat
セクション3.6.1では、名前付きクエリパラメータのバインディングのためのAPIについて説明します。