繁体   English   中英

休眠:如何将该条件重写为HQL?

[英]Hibernate: How do I rewrite this criteria to HQL?

我想写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”在某公司工作。

感谢帮助

编辑

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 ,但传递了一个Strings数组(varargs参数实际上是一个数组)
  2. 您必须使用setParameterList而不是setParameter来传递值的集合。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM