次のようなNamedQueryを作成しました。
@NamedQuery(name = "EventLog.viewDatesInclude",
query = "SELECT el FROM EventLog el WHERE el.timeMark >= :dateFrom AND "
+ "el.timeMark <= :dateTo AND "
+ "el.name IN (:inclList)")
私がしたいのは、パラメーター:inclListに1つのアイテムではなくアイテムのリストを入力することです。たとえば、new List<String>() { "a", "b", "c" }
がある場合、:inclListパラメーターでそれを取得するにはどうすればよいですか? 1つの文字列のみをコード化できます。例えば:
setParameter("inclList", "a") // works
setParameter("inclList", "a, b") // does not work
setParameter("inclList", "'a', 'b'") // does not work
setParameter("inclList", list) // throws an exception
文字列を作成し、そこからクエリ全体を作成できることは知っていますが、オーバーヘッドを避けたいと思いました。これを行うより良い方法はありますか?
関連質問:リストが非常に大きい場合、そのようなクエリを作成する良い方法はありますか?
コレクション値のパラメーターでIN
を使用する場合、(...)
は必要ありません。
@NamedQuery(name = "EventLog.viewDatesInclude",
query = "SELECT el FROM EventLog el WHERE el.timeMark >= :dateFrom AND "
+ "el.timeMark <= :dateTo AND "
+ "el.name IN :inclList")
適切なJPAクエリ形式は次のとおりです。
el.name IN :inclList
プロバイダとしてHibernateの古いバージョンを使用している場合、次のように記述する必要があります。
el.name IN (:inclList)
しかし、それはバグです( HHH-5126 )(編集:現在解決済みです)。
public List<DealInfo> getDealInfos(List<String> dealIds) {
String queryStr = "SELECT NEW com.admin.entity.DealInfo(deal.url, deal.url, deal.url, deal.url, deal.price, deal.value) " + "FROM Deal AS deal where deal.id in :inclList";
TypedQuery<DealInfo> query = em.createQuery(queryStr, DealInfo.class);
query.setParameter("inclList", dealIds);
return query.getResultList();
}
JPA 2、Jboss 7.0.2で動作します
以下に示すように、List
に変換する必要があります。
String[] valores = hierarquia.split(".");
List<String> lista = Arrays.asList(valores);
String jpqlQuery = "SELECT a " +
"FROM AcessoScr a " +
"WHERE a.scr IN :param ";
Query query = getEntityManager().createQuery(jpqlQuery, AcessoScr.class);
query.setParameter("param", lista);
List<AcessoScr> acessos = query.getResultList();