Hibernate: Как мне переписать этот критерий на HQL? - PullRequest
0 голосов
/ 30 августа 2011

Я хочу написать 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 Низет предложил код для 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 Ответ

1 голос
/ 30 августа 2011

У вас есть две проблемы:

  1. Вы объявляете параметр как java.util.List, но передаете массив строк (аргумент varargs на самом деле является массивом)
  2. Выдля передачи набора значений необходимо использовать setParameterList, а не setParameter.
...