2016-10-12 5 views
1

したがって、請求日が平均である請求日を取得するために、mysql datediff関数を使用しようとしています。実際のクエリが結果を返すにもかかわらず、Springデータ/ Hibernateネイティブクエリがnullを返す

私のクエリは次のようになります。

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) 

と私の実際の春のデータレポ定義のようになります。問題は、結果は常にnullであるということです

@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.SQLDEBUGに設定してsqlを見ると、sqlが正しいことになります。私はSQLを実行する場合、私は戻って番号を取得するので、私は実際に結果を返している休止状態で実行されている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 
+0

クエリの実行時にどのように日付がログに表示されていますか? – djointster

+0

@ScaryWombat私はリポジトリの一部を表示していますが、他にもたくさんの方法がありますが、この問題には何ら関係していません。 – Zipper

+0

'i.createdTimestamp'が' Timestamp'か 'Date'データ・タイプ。 – AppHouze

答えて

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

関連する問題