【问题标题】:Spring Data/Hibernate native query returning null even though real query returns results即使真实查询返回结果,Spring Data/Hibernate 本机查询也会返回 null
【发布时间】:2016-10-12 01:05:46
【问题描述】:

所以我尝试使用 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)

我实际的 spring 数据 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);
}

问题是结果始终为空,我尝试将返回类型设置为双精度,但也没有用。如果我将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

【问题讨论】:

  • 查询执行时,日期如何出现在日志中?
  • @ScaryWombat 我只展示了 repo 的一部分,还有很多其他方法,但它们与这个问题没有任何关系
  • 你能确认i.createdTimestampTimestamp还是Date数据类型。
  • @djointster 这里是跟踪记录的结果:01:16:34,628 [http-bio-8080-exec-43] TRACE org.hibernate.type.descriptor.sql.BasicBinder: - 绑定参数 [1] 作为 [VARBINARY] - [2016-10-01T00:00] 01:16:34,720 [http-bio-8080-exec-43] TRACE org.hibernate.type.descriptor.sql.BasicExtractor: - 提取值([avg(datediff(coalesce(nullableDateTimeColumn, now()), i.createdTimeStamp))] : [NUMERIC]) - [null]
  • @AppHouze i.CreatedTimestamp 是 DB 中的 DateTime,在代码中映射到 java.time.LocalDateTime

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


【解决方案1】:

这是给甲骨文的。它可能对你有帮助。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 2015-01-30
    相关资源
    最近更新 更多