在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。
,查询工作正常有什么建议吗?
由于
答案 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
这些查询返回对< fingerprint
,finger_count
>而不是完整的page_delta_summary
行(或实体)。