0

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)

query-param名に間違ったタイプを指定したため、これは正常です。何を置けばいいのかわからない:/

このサービスをよりよく理解するためのテストケース:

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

1 に答える 1

1

2つの問題があります。

  1. パラメータをとして宣言しますがjava.util.List、文字列の配列を渡します(varargs引数は実際には配列です)
  2. 値のコレクションを渡すには、を使用する必要があります。を使用する必要はsetParameterListありません。setParameter
于 2011-08-29T21:00:24.960 に答える