1

「要求された結果の型を使用して複数の戻り値を持つクエリの TypedQuery を作成できません」というエラーが表示されます

GlassfishでJPAを使用した次のクエリの場合、ここで何が間違っているのでしょうか? 特定の借方ステータスの最新の借方レコードを取得したい。

 entityManager.createQuery("select dd, MAX(dd.createdMillis) from T_DEBIT dd" +              
                " where dd.debitStatus in (:debitStatus)" +
                " and dd.account = :account" , Debit.class)
                .setParameter("debitStatus", false)
                .setParameter("account", account)
                .getSingleResult();
4

1 に答える 1

9

には通常、ジェネリック パラメータが指定されますTypedQuery。a を宣言した場合、列を射影していて完全なエンティティを返さない ためTypedQuery、 anObject[]を のジェネリック パラメータとして使用します。TypedQuery

ただし、(簡潔なコーディング スタイルを使用して) を宣言していないため、オブジェクトを選択せず​​に 2 つのフィールドのみを選択するTypedQueryように変更する必要がありDebit.classます。Object[].class

 Object[] result = entityManager.createQuery("select dd, MAX(dd.createdMillis) from T_DEBIT dd" +              
                " where dd.debitStatus in (:debitStatus)" +
                " and dd.account = :account" , Object[].class) //Notice change
                .setParameter("debitStatus", false)
                .setParameter("account", account)
                .getSingleResult();

このクエリを実行すると、 select ステートメントのフィールドに対応するObject[]各インデックスが返されます。Object[]例えば:

result[0] = dd
result[1] = max(dd.createdMillis)

を使用しObject[]ないようにするには、新しいクラスを作成して、より厳密に型指定された方法でこれらの値を取得できます。何かのようなもの:

public class Result {

    String dd;
    Date createdMillis;

    public Result(String dd, Date createdMillis) {
        super();
        this.dd = dd;
        this.createdMillis = createdMillis;
    }

    public String getDd() {
        return dd;
    }

    public void setDd(String dd) {
        this.dd = dd;
    }

    public Date getCreatedMillis() {
        return createdMillis;
    }

    public void setCreatedMillis(Date createdMillis) {
        this.createdMillis = createdMillis;
    }

}

次に、JPQL ステートメントでコンストラクターを呼び出すことができます。

Result result = entityManager.createQuery("select NEW fully.qualified.Result(dd, MAX(dd.createdMillis)) from T_DEBIT dd" +              
                " where dd.debitStatus in (:debitStatus)" +
                " and dd.account = :account" , Result.class)
                .setParameter("debitStatus", false)
                .setParameter("account", account)
                .getSingleResult();

最近、私はこの正確なトピックについてブログを書いています。私が作成したこのビデオ チュートリアルをご覧になることをお勧めします: https://tothought.cloudfoundry.com/post/16

于 2013-05-28T08:46:47.393 に答える