如何覆盖Postgres' array_agg(表达式)函数?

时间:2014-06-12 21:08:27

标签: java hibernate postgresql

我正在使用hibernate来调用Postgres array_agg函数。问题是我需要通过包含的顺序调用该函数。我无法通过hibernate以正确的语法传递顺序,所以我需要创建一个函数,它完全按照array_agg执行自动排序。这是我需要在函数中复制的内容:

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

我已经尝试过并试过但我无法弄明白 - 谷歌并没有多大帮助。提前谢谢!

2 个答案:

答案 0 :(得分:0)

您可以通过将有序集合提供给聚合函数来替换丢失的特征 - 这在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

你应该能够用有限的Hibernate手段来实现它。

答案 1 :(得分:0)

我只是通过创建自定义聚合函数并使用最终函数(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='{}'
);

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