我想编写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也一样。我正在使用命名查询,但我无法将数组或字符串列表(或任何内容)作为命名查询的参数传递。这是我的尝试,不起作用。
<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)
这是正常的,因为我为查询参数名称指定了错误的类型。我不知道该放什么:/
测试用例以更好地理解此服务:
assertTrue (2 == service.namesInCompany(someCompany, session, "jon", "josh").size());
这意味着,“jon”或“josh”在某些公司工作。
感谢您的帮助
修改
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();
}
答案 0 :(得分:1)
你有两个问题:
java.util.List
,但是您传递了一个字符串数组(varargs参数实际上是一个数组)setParameterList
而非setParameter
来传递一组值。