gpt4 book ai didi

java - Hibernate:如何将此标准重写为 HQL?

转载 作者:行者123 更新时间:2023-12-01 15:45:00 26 4
gpt4 key购买 nike

我想编写 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();
}

最佳答案

您有两个问题:

  1. 您将参数声明为 java.util.List,但传递了一个字符串数组(varargs 参数实际上是一个数组)
  2. 您必须使用 setParameterList 而不是 setParameter 来传递值集合。

关于java - Hibernate:如何将此标准重写为 HQL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7235828/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com