Hibernate で "IN" クエリを実行する 質問する

Hibernate で

文字列に ID のリストがあり、Hibernate を使用してこれらの ID を持つ行を取得したいと考えています。はTrackedItemHibernate/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について説明します。

おすすめ記事