【问题标题】:Hibernate named query issueHibernate 命名查询问题
【发布时间】:2016-05-18 11:04:03
【问题描述】:

我有以下姓名查询

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

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

【问题讨论】:

  • 首先 - 向我们展示整个查询执行代码;其次 - 告诉我们哪个数据库在 Hibernate 引擎盖下(我猜是 Oracle)......您还可以格式化粘贴的查询 - 以提高可读性。
  • 请检查我的更新问题。

标签: java hibernate


【解决方案1】:

尝试使用@NamedNativeQuery 而不是@NamedQuery

还要检查this explanation 它们之间的区别。

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

【讨论】:

  • 我不想使用@NamedNativeQuery。我只使用namedQuery。如何在命名查询中使用相同的查询?
  • @ShiladittyaChakraborty 如果您必须使用@NamedQuery,您必须将您的本地 Oracle 查询“翻译”为 HQL/JPQL,但是,这可能很困难,或者,正如有人提到的,甚至是不可能的......
  • 有没有其他方法可以实现namedquery中的listtag功能?
  • @ShiladittyaChakraborty 我在 HQL 中没有听说过类似的东西,但我并不是说根本没有类似的东西。尝试搜索或创建另一个问题。
【解决方案2】:

发生错误是因为LISTAGG 是一个特定于oracle 的函数。 该功能在 HQL 中不可用,并且没有任何东西可以用于 HQL。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-13
    • 2023-03-27
    • 2011-06-07
    • 1970-01-01
    • 1970-01-01
    • 2014-05-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多