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