如何在hibernate中使用listagg

Sta*_*ley 6 sql hibernate oracle11g

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

请考虑下表

 ROLE_ID    ENAME
---------- ----------
       4    CLARK
       4    KING
       4    MILLER
       7    ADAMS
       9    FORD
       9    JONES
Run Code Online (Sandbox Code Playgroud)

在SQL Developer中使用以下查询

SELECT ROLE_ID,
       LISTAGG(ENAME, ',') WITHIN GROUP (ORDER BY ENAME) AS EMPLOYEES 
FROM USERS 
GROUP BY ROLE_ID;
Run Code Online (Sandbox Code Playgroud)

将导致控制台输出中的以下内容

ROLE_ID EMPLOYEES
-----------------------------
4        CLARK,KING,MILLER
7        ADAMS
9        FORD, JONES
Run Code Online (Sandbox Code Playgroud)

我的目标是尝试在休眠中执行此操作,但我不确定如何继续.任何帮助表示赞赏.

小智 6

对于任何使用listagg作为公式的一部分而遇到问题的人来说,在Hibernate中注册"within"关键字可以解决我的问题.(使用Hibernate 5.0.7.)

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

        registerKeyword("within");
    }
}
Run Code Online (Sandbox Code Playgroud)

在此之前,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;
Run Code Online (Sandbox Code Playgroud)

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


小智 0

Hibernate 默认不理解 sql 函数。尝试在 hibernateDialect 中注册。

registerFunction("listAgg", new StandardSQLFunction("listAgg", Hibernate.STRING));
Run Code Online (Sandbox Code Playgroud)