2016-10-12 2 views
1

Also versuche ich, die mysql datediff-Funktionen zu verwenden, um eine durchschnittliche Anzahl von Tagen zu erhalten, an denen eine Rechnung alt ist.Die native Abfrage von Spring Data/Hibernate gibt NULL zurück, obwohl die echte Abfrage Ergebnisse zurückgibt

Meine Abfrage sieht wie folgt aus:

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) 

und meine eigentliche Federdaten Repo-Definition sieht wie folgt aus:

@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); 
} 

Das Problem ist, dass das Ergebnis immer Null ist, habe ich versucht Einstellung der Rückkehr Geben Sie doppelt ein, aber das hat auch nicht funktioniert. Wenn ich log4j.logger.org.hibernate.SQL auf DEBUG setze und auf den SQL-Server schaue, ist der SQL korrekt. Wenn ich den sql starte, bekomme ich eine Nummer zurück, also weiß ich, dass die SQL, die von Hibernate ausgeführt wird, tatsächlich ein Ergebnis zurückgibt. Der Rückgabewert ist ziemlich klein, normalerweise zwischen 0-5, also ist es kein seltsamer Überlauffehler oder irgendetwas anderes. Dies scheint ein einfaches Szenario zu sein, daher bin ich ein wenig perplex darüber, warum das nicht funktioniert.

Versionen:

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

, wie das Datum in den Protokollen angezeigt wird, wenn die Abfrage ausgeführt wird? – djointster

+0

@ScaryWombat Ich zeige nur einen Teil des Repos, es gibt eine Reihe von anderen Methoden, aber sie sind in keiner Weise auf dieses Problem bezogen – Zipper

+0

Können Sie bestätigen, dass "i.createdTimestamp" ist "Timestamp" oder "Date" Datentyp. – AppHouze

Antwort

0

Dies ist für Oracle. Es kann dir helfen.

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) 

Referenz here

Verwandte Themen