有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何重写Postgres的array_agg(expression)函数?

我正在使用hibernate调用Postgresarray_agg函数。问题是我需要调用包含orderby的函数。我无法以正确的语法通过hibernate传递order by,因此我需要创建一个函数,该函数与array_agg自动排序的功能完全相同。以下是我需要在函数中复制的内容:

array_agg(table.TEXT order by table.text asc)

我试了又试,但我想不出来——谷歌帮不了多少忙。提前谢谢


共 (2) 个答案

  1. # 1 楼答案

    我只是通过创建一个自定义聚合函数并使用final函数(FFUNC)就解决了这个问题

    CREATE OR REPLACE FUNCTION order_func(anyarray) RETURNS anyarray AS $BODY$ 
         BEGIN
            return ARRAY(SELECT unnest($1) ORDER BY 1);
         END;
    $BODY$ LANGUAGE 'plpgsql';
    
    CREATE AGGREGATE array_agg_order_func(anyelement) (
    SFUNC=array_append,
    STYPE=anyarray,
    FFUNC=order_func,
    INITCOND='{}'
    );
    

    然后将聚合的数组传递给排序函数

  2. # 2 楼答案

    您可以通过向聚合函数提供一个有序集来替换缺少的功能,聚合函数在Postgres中有效,但不是标准的SQL方法(正如@Richard在他的评论中提到的):

    SELECT array_agg(sub.text) AS ordered_array
    FROM  (SELECT text FROM tbl ORDER BY text) sub
    

    或者,对于这样的简单情况,只需使用array constructor

    SELECT ARRAY( SELECT text FROM tbl ORDER BY 1 ) AS ordered_array
    

    您应该能够通过有限的休眠方式实现这一点