JPA TypedQuery错误

时间:2013-05-28 08:38:36

标签: java hibernate jpa

我收到错误“无法使用请求的结果类型创建具有多个返回的查询的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();

1 个答案:

答案 0 :(得分:9)

通常为TypedQuery指定通用参数。如果您声明了TypedQuery,则会使用Object[]作为TypedQuery的通用参数,因为您要投影列而不返回完整的实体。

但是,由于您尚未声明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[],其中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