Spring Data / Hibernate本机查询返回null,即使实际查询返回结果

时间:2016-10-12 01:05:46

标签: java spring hibernate spring-data spring-data-jpa

所以我正在尝试使用mysql datediff函数来获得发票旧的平均天数。

我的查询如下:

 select avg(datediff(coalesce(nullableDateTimeColumn, now()), i.createdTimeStamp)) from invoice i 
 where i.createdTimestamp >= DATE_VARIABLE_HERE and (invoiceStatus = 'TEXT_HERE' or nullableDateTimeColumn is not null)

我的实际弹簧数据repo定义如下所示:

@Repository
interface InternalInvoiceRepository extends PagingAndSortingRepository<Invoice, Long> {

@Query(value = "select avg(datediff(coalesce(nullableDateTimeColumn, now()), i.createdTimeStamp)) from invoice i " +
            "where i.createdTimestamp >= ?1 " +
            "and (invoiceStatus = 'TEXT_HERE' or nullableDateTimeColumn is not null)", nativeQuery = true)
    BigDecimal getAverageTimeInvoiceEntryTimeForInvoicesNewerThan(LocalDateTime time);
}

问题是结果总是为null,我尝试将返回类型设置为double但这也不起作用。如果我将log4j.logger.org.hibernate.SQL设置为DEBUG并查看sql,则sql是正确的。如果我运行sql我得到一个数字,所以我知道hibernate运行的sql实际上是返回一个结果。返回的值非常小,通常在0-5之间,所以它不是一些奇怪的溢出错误或其他类似的东西。这看起来像是一个简单的场景,所以我对为什么这不起作用感到有些困惑。

版本:

Spring data: 1.9.2.RELEASE
Spring: 4.2.4.RELEASE
Hibernate: 5.0.7.Final
hibernate-jpa-2.1-api: 1.0.0.Final

1 个答案:

答案 0 :(得分:0)

这适用于Oracle。它可能对你有帮助。

SELECT avg(TO_NUMBER(TO_CHAR(ADD_MONTHS(
(coalesce(nullableDateTimeColumn, SYSDATE)), TO_CHAR(i.createdTimeStamp, MM')), 'YYYYMMDD')))
FROM   invoice i
WHERE  i.createdTimeStamp >= '20160401' -- for example
       AND ( invoiceStatus = 'TEXT_HERE'
          OR nullableDateTimeColumn IS NOT NULL ) 

参考here