45

文字列に 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部分を機能させることができますか? ありがとう。

4

3 に答える 3

75

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 名前付きパラメータ

名前付きパラメーターは、「:」記号が前に付く ID です。これは、セクション 4.4.1 で定義された識別子の規則に従います。名前付きパラメーターでは、大文字と小文字が区別されます。

例:

SELECT c
FROM Customer c
WHERE c.status = :stat

セクション 3.6.1 では、名前付きクエリ パラメータをバインドするための API について説明します。

于 2010-06-27T04:27:15.087 に答える
11

古い非 JPA 休止状態を使用するほど運が悪い場合は、これでうまくいくはずです。

Query query = session.createQuery("FROM TrackedItem item WHERE item.id IN (:items)");
query.setParameterList("items", Arrays.asList(380L, 382L, 386L));

@SuppressWarnings("unchecked")
List<TrackedItem> results = query.list();
于 2015-04-13T18:52:33.840 に答える