我正在尝试做一些非常简单的事情,但不知何故,如果没有本机查询,我就无法使其工作。
这是我的实体:
public class A {
private long id
private String key
private UUID value
}
在我的存储库中,我有以下方法:
@Query(value = """
SELECT key as key,
ARRAY_AGG(value) AS values
FROM table_a
WHERE key IN (:keys)
GROUP BY key
""", nativeQuery = true)
List<MyProjection> getValuesByKeys(Collection<String> keys);
与
public interface MyProjection {
String getKey();
UUID[] getValues();
}
它有效,并向我返回 MyProjection 对象的列表,但我想让它不是本机查询。我尝试了以下各种变体,但总是出现该错误:
Caused by: org.hibernate.query.SemanticException: 'WITHIN GROUP' or 'OVER' clause is mandatory for ordered set aggregate function: array_agg
@Query(value = """
SELECT new MyProjection(key, ARRAY_AGG(a.value))
FROM A a
WHERE a.key IN (:keys)
GROUP BY a.key
""")
List<MyProjection> getValuesByKeys(Collection<String> keys);
我认为 array_agg 不是一个好的方法,但我找不到任何有关正确调用的信息。
提前致谢。
这个对我有用
@Query(value = """
SELECT new full.package.name.MyProjection(keyV, ARRAY_AGG(a.value)
OVER (partition by a.key
order by a.id))
FROM KeyValue a
WHERE a.key IN (:keys)
""")
List<MyProjection> getValuesByKeys(@Param("keys") Collection<String> keys);
出于测试目的,我将我的实体命名为
KeyValue
。