【问题标题】:How to override Postgres' array_agg(expression) function?如何覆盖 Postgres 的 array_agg(expression) 函数?
【发布时间】:2014-06-12 21:08:27
【问题描述】:

我正在使用休眠来调用 Postgres array_agg 函数。问题是我需要使用包含的顺序调用该函数。我无法以正确的语法通过 hibernate 传递订单,因此我需要创建一个函数,该函数与 array_agg 在自动排序时所做的完全一样。这是我需要在函数中复制的内容:

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

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

【问题讨论】:

  • 它不是函数的一部分,它是 SQL 语法的一部分。修复你的框架。它是开源的,所以提交一个补丁。
  • 我知道它不是函数的一部分。这就是为什么我说我需要创建一个自定义函数。

标签: java hibernate postgresql


【解决方案1】:

您可以通过将有序集提供给聚合函数来替换缺少的功能 - 这在 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 的有限方式来实现它。

【讨论】:

  • 我会在早上试一试。我的目标是避免做任何不必要的子查询或连接。如果可能的话 - 我宁愿创建一个可以进行排序的自定义聚合。
【解决方案2】:

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

这会将聚合数组传递给排序函数。

【讨论】:

    猜你喜欢
    • 2014-12-09
    • 1970-01-01
    • 2011-07-21
    • 2016-05-04
    • 2012-10-16
    • 2020-07-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多