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)
| 归档时间: |
|
| 查看次数: |
5106 次 |
| 最近记录: |