java - OpenJPA:如何构建具有组计数的 GROUP BY 查询

标签 java sql group-by jpql openjpa

在 JPQL 中,我想构造与此等效的查询:

select *, count(*) as finger_count from page_delta_summary 
where delta_history_id = ? and change_type = ? group by fingerprint;

其中fingerprint是表page_delta_summary中的varchar字段。我所拥有的是这样的:

select d, count(d) as finger_count from PageDeltaSummary d 
where d.deltaHistoryId = :deltaHistoryId and d.type = :pageDeltaType 
GROUP BY d.fingerprint"

其中 PageDeltaSummary 是我的实体。但我遇到以下异常:

org.apache.openjpa.persistence.ArgumentException:您对类型“class com.su3analytics.sitedelta.model.PageDeltaSummary”的查询,带有过滤器“select d, count(d) from PageDeltaSummary d where d.deltaHistoryId = :deltaHistoryId and d.type = :pageDeltaType GROUP BY d.fingerprint"无效。 您的 select 和having 子句必须仅包含也出现在分组子句中的聚合或值。

如果我删除 count(d) 作为 Finger_count 或 GROUP BY,则查询工作正常。

有什么建议吗?

谢谢

最佳答案

您的原始 SQL 查询没有意义,因此您无法转换为 JPQL。

我猜您想获取每个指纹满足where条件的page_delta_summary行数。如果是这样,SQL 查询如下所示:

select fingerprint, count(*) as finger_count from page_delta_summary  
where delta_history_id = ? and change_type = ? group by fingerprint;

和 JPQL - 像这样:

select d.fingerprint, count(d) from PageDeltaSummary d    
where d.deltaHistoryId = :deltaHistoryId and d.type = :pageDeltaType    
GROUP BY d.fingerprint

这些查询返回<fingerprintfinger_count>对,而不是完整的page_delta_summary行(或实体)。

关于java - OpenJPA:如何构建具有组计数的 GROUP BY 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4255543/

相关文章:

java - HashMap#hash(int)方法的解释

mysql - 压缩多个嵌套的 select 语句

java - 为什么这个 INSERT 不起作用?

mysql - 这个带有左连接和分组依据(在错误的列上)的 MYSQL 查询中发生了什么?

java - 如何在ReSTLet Framework中设置ClientResource发送请求的超时时间

java - 如何防止gradle下载SNAPSHOT jar

java - 项目的异常 Spring Hibernate Jndi Tomcat

MySQL 查询获取 2 个月前的所有行

mySQL 分组依据?

SQL 分组/契约(Contract)值