【问题标题】:JPQL Native Query using SUM and COUNT使用 SUM 和 COUNT 的 JPQL 原生查询
【发布时间】:2012-02-16 02:27:20
【问题描述】:

我正在尝试运行以下代码:

public BigDecimal valuate(String searchTerms, String categoryPath) {
    Query query = em.createNativeQuery("SELECT SUM(maxBidAmount) / COUNT(maxBidAmount) FROM Item WHERE MATCH(title) AGAINST(':searchTerms') AND categoryPath=':categoryPath'", Double.class);
    query.setParameter("searchTerms", searchTerms);
    query.setParameter("categoryPath", categoryPath);
    double value = (double) query.getSingleResult();
    return new BigDecimal(value);
}

当我这样做时,我得到以下异常:

Exception Description: Missing descriptor for [class java.lang.Double].

当我删除 Double.class 时,我得到一个不同的异常。

所以,我只是想知道在 JPQL 中使用 COUNT 和 SUM 的正确方法。

【问题讨论】:

  • 使用 hibernate 4 和 Oracle 驱动程序并且没有明确指定类型,我得到“Number”作为类,它可以与 Number#intValue() 一起使用。也许你可以试试Number.class 而不是Double.class? int value = ((Number)query.getSingleResult()).intValue();

标签: java sql jpa eclipselink jpql


【解决方案1】:

如果 SQL 有效,则无需在查询定义中指定 Double.class - 只需使用 em.createNativeQuery(SQLString); 当您希望 JPA 提供程序根据结果构建实体时使用返回类型,但在这种情况下您需要原始数据。

【讨论】:

  • 当我将此建议与不使用查询参数相结合,并简单地将字符串拼凑在一起时,查询有效,谢谢。
  • 在我的情况下它返回 BigInteger,我通常将其转换为 Number,另请参阅 stackoverflow.com/questions/8342572/…
【解决方案2】:

本机查询是 SQL,而不是 JPQL,您可以像使用任何 SQL 一样为您的 RDBMS 使用这些关键字。 看起来您的 JPA 提供程序不接受 Double 作为结果类(有些只允许结果类是实体)。

DataNucleus JPA 当然允许非实体结果类。

【讨论】:

  • 是的,你是对的。它不是 JPQL。 Double 是一个简单的类型,所以我会假设它会被支持。我觉得这是我的错误方法,而不是 JPA 实现(Eclipse Link)的缺陷。
  • 在通过 JPA 使用 SQL 时,您应该使用编号参数 ?1、?2 等而不是 :param1。这并不能解决 Double 部分,但正如我已经说过的......一些实现会支持它
猜你喜欢
  • 1970-01-01
  • 2019-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多