【问题标题】:Hibernate: How do I rewrite this criteria to HQL?Hibernate:如何将此条件重写为 HQL?
【发布时间】:2011-11-06 08:12:11
【问题描述】:

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

这很正常,因为我为查询参数名称指定了错误的类型。我不知道该放什么:/

为了更好地理解这项服务的测试用例:

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();
    }

【问题讨论】:

  • 向我们展示 service.namesInCompany 的代码
  • @JB Nizet 完成,请查看我的编辑。

标签: java hibernate hql hibernate-criteria


【解决方案1】:

你有两个问题:

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

【讨论】:

    猜你喜欢
    • 2016-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-23
    • 2011-04-25
    • 1970-01-01
    • 1970-01-01
    • 2020-09-08
    相关资源
    最近更新 更多