在 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
这些查询返回<fingerprint
、finger_count
>对,而不是完整的page_delta_summary
行(或实体)。
关于java - OpenJPA:如何构建具有组计数的 GROUP BY 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4255543/