我正在尝试使用 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/