HQLを作成したいのですが、会社に名前の付いた人(従業員)がいるかどうかを調べます。私は基準でそれを行うことができました:
public List<Person> namesInCompany(Company company, Session session,
String... names) {
return session.createCriteria(Person.class)
.add(Restrictions.in("name", names))
.add(Restrictions.eq("company", company))
.list();
}
さて、HQLについても同じようにお願いします。名前付きクエリを使用していますが、名前付きクエリのパラメータとして配列または文字列のリスト(またはその他)を渡す方法に問題があります。これが私の試みですが、ATMでは機能しません。
<query name="namesInCompany">
<query-param name="company" type="sk.xorty.task.Company"/>
<query-param name="names" type="java.util.List"/>
<![CDATA[
from Person p
where p.company = :company
and p.name in (:names)
]]>
</query>
ClassCastExceptionが発生します
java.lang.ClassCastException: [Ljava.lang.String; cannot be cast to java.lang.String
at org.hibernate.type.descriptor.java.StringTypeDescriptor.unwrap(StringTypeDescriptor.java:40)
query-param名に間違ったタイプを指定したため、これは正常です。何を置けばいいのかわからない:/
このサービスをよりよく理解するためのテストケース:
assertTrue (2 == service.namesInCompany(someCompany, session, "jon", "josh").size());
つまり、「jon」または「josh」のいずれかがsomeCompanyで機能するということです。
手伝ってくれてありがとう
編集
JB Nizetは、service.namesInCompanyのコードを提案しました。ここにあります:
public List<Person> namesInCompany(Company company, Session session,
String... names) {
Query namesInCompany = session.getNamedQuery(
"sk.xorty.task.Person.namesInCompany");
namesInCompany.setParameter("company", company);
namesInCompany.setParameter("names", names);
return namesInCompany.list();
}