sql - 如何在 hibernate 中使用listagg

标签 sql hibernate oracle11g

我正在尝试使用 listagg 函数来生成用户列表。

考虑下表

 ROLE_ID    ENAME
---------- ----------
       4    CLARK
       4    KING
       4    MILLER
       7    ADAMS
       9    FORD
       9    JONES

在 SQL Developer 中使用以下查询
SELECT ROLE_ID,
       LISTAGG(ENAME, ',') WITHIN GROUP (ORDER BY ENAME) AS EMPLOYEES 
FROM USERS 
GROUP BY ROLE_ID;

将在控制台输出中产生以下结果
ROLE_ID EMPLOYEES
-----------------------------
4        CLARK,KING,MILLER
7        ADAMS
9        FORD, JONES

我的目标是尝试在 hibernate 状态下执行此操作,但我不确定如何进行。
任何帮助表示赞赏。

最佳答案

对于使用 listagg 作为公式的一部分有问题的任何人,在 Hibernate 中注册“within”关键字为我解决了这个问题。 (使用 Hibernate 5.0.7。)

public class CustomOracleDialect extends Oracle10gDialect {
    public CustomOracleDialect() {
        super();

        registerKeyword("within");
    }
}

在此之前,Hibernate 会尝试在“within”关键字前加上外部表的别名来中断查询。注册关键字后,以下工作:
@Formula("(select (listagg(l.serial_number, ', ') within group(order by d.serial_number))\n"
        + "from order_lines l\n"
        + "where l.order_id = id\n"
        + "group by l.order_id)")
private String serialNumbers;

请注意,如果您尝试为 listagg 表达式分配别名,它仍然会中断查询,因为 Hibernate 也尝试在它前面加上表的别名。这当然不是公式查询的问题,但如果使用 listagg 作为命名查询的一部分,您可能需要省略别名并按结果集中的位置引用列。

关于sql - 如何在 hibernate 中使用listagg,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23666277/

相关文章:

mysql - 寻求有关加入查询的帮助

sql - 查询 SQL Server 数据字典以查找包含表 'x' 的所有数据库

java - 在 Hibernate 4.3.4 中覆盖 @Where 子句条件

java - ORA-01843 : not a valid month

sql - 为什么 CREATE TABLE AS SELECT 比 INSERT with SELECT 更快

MySQL 老化触发器

php - 获取数据以便在表单上进行编辑

java - Extend an entity class in JPA throws Unknown column 'DTYPE' in 'field list' 错误

java - Hibernate 4升级,COMMIT未发出

mysql - 提取表名的一部分并将其打印在控制台上