我有以下名称查询
@NamedQuery(name="ScInstantTrack.getCustomerDetails",
query="select b.cardDetail.mstCustomer.customerId, last_day(b.endDate), " +
"LISTAGG(b.txnId,'|') WITHIN GROUP (ORDER BY b.endDate), " +
"count(b.txnId), sum(b.amount), sum(b.balanceAmt), sum(b.redemptionAmt) " +
"from ScInstantTrack b " +
"where b.cardNo = b.cardDetail.cardBarcode " +
"AND b.cardDetail.mstCustomer.customerId = :customerId " +
"and b.startDate <= trunc(:todayDate) " +
"and b.endDate >= trunc(:todayDate) " +
"and b.cardDetail.mstStatus.statusId = 3003 group by b.cardDetail.mstCustomer.customerId, last_day(b.endDate)")
当我执行此查询时,会出现以下错误:
unexpected token: WITHIN
我正在使用Oracle数据库。
为什么我收到此错误?如何解决这个问题?
答案 0 :(得分:1)
尝试使用@NamedNativeQuery
代替@NamedQuery
。
同时检查this explanation之间的差异。
基本上,您使用的是Oracle DB中独有的表达式。换句话说 - 您希望执行本机查询(在本机中查询Oracle DB语言)。命名查询使用Java Persistence Query Language
(HQL,即。)。
答案 1 :(得分:0)
发生错误是因为LISTAGG
是特定于oracle的函数。
该函数在HQL中是不可用的,并且您无法使用任何代替HQL。
为了获得结果,您必须使用SQLQuery
执行本机SQL查询。这样你就必须为每个数据库实现一个thw查询版本,但它可以工作。