我正在从事Spring Boot 1.5项目。 我实现了listagg,但是却收到“ Within中的令牌异常错误”,请帮助我在休眠状态下实现listagg而不使用本机查询。
Output:
jobname Empno
AC_ACCOUNT 206
AC_MGR 205
AD_ASST 200
AD_PRES 100
AD_VP 101,102
FI_ACCOUNT 110 ,113 ,111 ,109 ,112
select jobname, listagg(empno, ',') within group (order by empno) empno
from emp group by jobname;
-
unexpected token: within","stack_trace":"antlr.NoViableAltException: unexpected token: within
at org.hibernate.hql.internal.antlr.HqlBaseParser.aliasedExpression(HqlBaseParser.java:2365)
at org.hibernate.hql.internal.antlr.HqlBaseParser.selectedPropertiesList(HqlBaseParser.java:1379)
at org.hibernate.hql.internal.antlr.HqlBaseParser.selectClause(HqlBaseParser.java:1282)
at org.hibernate.hql.internal.antlr.HqlBaseParser.selectFrom(HqlBaseParser.java:1022)
at org.hibernate.hql.internal.antlr.HqlBaseParser.queryRule(HqlBaseParser.java:730)
at org.hibernate.hql.internal.antlr.HqlBaseParser.selectStatement(HqlBaseParser.java:323)
at org.hibernate.hql.internal.antlr.HqlBaseParser.statement(HqlBaseParser.java:186)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.parse(QueryTranslatorImpl.java:279)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:187)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:142)
at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:115)
at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:76)
at org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:150)
at org.hibernate.internal.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:302)
at org.hibernate.internal.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:240)
at org.hibernate.internal.SessionImpl.createQuery(SessionImpl.java:1907)
at
答案 0 :(得分:0)
恐怕但这是不可能的。 JPA和Hibernate都不知道listagg。
您必须使用SQL。
原因是JPA和Hibernate已实现了可在所有数据库上运行的功能,但listagg仅由少数几个实现。
答案 1 :(得分:0)
要在休眠查询中使用listagg:
通过扩展Oracle10gDialect(如果您使用的是Oracle)或MySQLDialect(对于MySQL),在Hibernate方言中首先注册listagg函数。
public class CustomOracle10gDialect extends Oracle10gDialect {
public CustomOracle10gDialect() {
super();
registerFunction("LISTAGG", new SQLFunctionTemplate(StandardBasicTypes.STRING,"LISTAGG(?1,',') WITHIN GROUP(ORDER BY ?1)"));
}
}
更新您的配置文件以使用自定义方言。 spring.jpa.database-platform = com.abc.CustomOracle10gDialect或com.abc.CustomOracle10gDialect
使用LISTAGG()示例-从联系人c中选择c.id,listagg(firstName),其中GROUP BY c.id