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

泛型参数通常是为 a 指定的TypedQuery。如果您声明 aTypedQuery您将使用 anObject[]作为 的通用参数TypedQuery,因为您正在投影列而不是返回完整的实体。

但是,由于您尚未声明 a 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();

执行此查询将返回一个Object[]where 中的每个索引Object[]与您的 select 语句中的一个字段相对应。例如:

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 回答