web-dev-qa-db-ja.com

Hibernateで「IN」クエリを実行する

Stringに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パーツを機能させるにはどうすればよいですか?ありがとう。

33
Amy B

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について説明します

62
Pascal Thivent

古い非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();
10
depsypher

クエリが正しく実行された場合でも、クエリパラメータに含まれる値が多すぎると、エラーが発生する場合があります。

Hibernate 5.1以降を使用している場合、この問題の1つの可能な解決策は、Session.byMultipleIds()を使用することです。

session
    .byMultipleIds(TrackedItem.class)
    .multiLoad(1L, 2L, 3L);

詳細については、 https://thoughts-on-Java.org/fetch-multiple-entities-id-hibernate/ を参照してください