在spring jpa中通过返回列表或值进行分组

问题描述 投票:0回答:1

我正在尝试做一些非常简单的事情,但不知何故,如果没有本机查询,我就无法使其工作。

这是我的实体:

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 不是一个好的方法,但我找不到任何有关正确调用的信息。

提前致谢。

java hibernate jpa spring-data-jpa
1个回答
0
投票

这个对我有用

@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

© www.soinside.com 2019 - 2024. All rights reserved.