OpenJPA:如何使用组计数构造GROUP BY查询

时间:2010-11-23 11:26:09

标签: 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其中d.deltaHistoryId =:deltaHistoryId and d.type =:pageDeltaType GROUP BY d.fingerprint“无效。 您的select和having子句只能包含也出现在分组子句中的聚合或值。

如果我将count(d)删除为finger_count或GROUP BY。

,查询工作正常

有什么建议吗?

由于

1 个答案:

答案 0 :(得分:2)

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

我想您希望为每个page_delta_summary计算满足where条件的fingerprint行数。如果是这样,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行(或实体)。