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
パーツを機能させるにはどうすればよいですか?ありがとう。
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について説明します
古い非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();
クエリが正しく実行された場合でも、クエリパラメータに含まれる値が多すぎると、エラーが発生する場合があります。
Hibernate 5.1以降を使用している場合、この問題の1つの可能な解決策は、Session.byMultipleIds()を使用することです。
session
.byMultipleIds(TrackedItem.class)
.multiLoad(1L, 2L, 3L);
詳細については、 https://thoughts-on-Java.org/fetch-multiple-entities-id-hibernate/ を参照してください