Hibernate命名查询问题

时间:2016-05-18 11:04:03

标签: java hibernate

我有以下名称查询

@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数据库。

为什么我收到此错误?如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

尝试使用@NamedNativeQuery代替@NamedQuery

同时检查this explanation之间的差异。

基本上,您使用的是Oracle DB中独有的表达式。换句话说 - 您希望执行本机查询(在本机中查询Oracle DB语言)。命名查询使用Java Persistence Query Language(HQL,即。)。

答案 1 :(得分:0)

发生错误是因为LISTAGG是特定于oracle的函数。 该函数在HQL中是不可用的,并且您无法使用任何代替HQL。

为了获得结果,您必须使用SQLQuery执行本机SQL查询。这样你就必须为每个数据库实现一个thw查询版本,但它可以工作。