Java 使用SUM和COUNT的JPQL本机查询

Java 使用SUM和COUNT的JPQL本机查询,java,sql,jpa,eclipselink,jpql,Java,Sql,Jpa,Eclipselink,Jpql,我正在尝试运行以下代码: 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=':categoryP

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

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的正确方法

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


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

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

是的,你说得对。它不是JPQL。Double是一种简单的类型,因此我假设它将受到支持。我觉得这是我的错误方法,而不是JPA实现(Eclipse链接)中的缺陷。通过JPA使用SQL时,应该使用编号参数?1、?2等,而不是:param1。这并不能解决双重问题,但正如我已经说过的。。。一些实现会支持这样的做法:当我将此建议与不使用查询参数结合起来,并简单地拼凑字符串时,查询就成功了,谢谢。在我的例子中,它返回BigInteger,我通常将其转换为Number,另请参见hibernate 4和Oracle驱动程序,并且没有明确指定的类型,我将“Number”作为类,可与数字#intValue()一起使用。也许你可以试试
Number.class
而不是
Double.class
?int value=((Number)query.getSingleResult()).intValue();