Ich muss das erwartete Ergebnis unten generieren. Im Grunde handelt es sich um eine Abfrage, um Werte nach einem bestimmten Zeitraum (WOCHE, MONATLICH usw.) zu aggregieren. Es gibt einen Datumsfilter mit Anfang und Ende, und wir müssen Werte für den gesamten Bereich zurückgeben. Wenn sie nicht vorhanden sind, sollte 0 zurückgegeben werden.Was ist der richtige Ansatz zur Behandlung von JPA-Periodenabfragen?
Im folgenden Beispiel ist das Startdatum '2015-08-02' und das Datum '2015-08-23' und der Zeitraum ist WOCHE. Beachten Sie, dass wir für Woche 2 keine Werte haben, aber es sollte mit einem Nullwert zurückgegeben werden.
Also, in diesem Fall, was ist der beste Ansatz, dies mit JPA zu tun? Wir denken über die Verwendung von temporären Tabellen nach und verknüpfen die Ergebnisse mit dieser Tabelle, um Ergebnisse für den gesamten Bereich zu erhalten, aber ich weiß nicht, ob dies mit JPA möglich ist, da wir die Tabelle erstellen, verknüpfen und dann die temporäre Tabelle löschen müssen.
Eine weitere Option besteht darin, eine Datenbankansicht zu erstellen und sie einer Entität zuzuordnen.
In den vorgenannten Fällen sollte die JPQL Abfrage so ähnlich sein:
@Query("select status, sum(totalInvoice), week from Invoice where " +
"left join TempTable as tt..." + <-- TEMP TABLE OR VIEW TO GET THE PERIODS
"issuer.id = :issuerId and type = :type and (:recipientId is null or recipient.id = :recipientId) and " +
"status in ('ISSUED', 'PAID') " +
"group by status")
Eine weitere Option, um eine gespeicherte Prozedur zu verwenden ist, aber sie scheinen schwierig zu sein, mit JPA zu implementieren und ich glaube nicht, dass sie notwendig sind.
Erwartetes Ergebnis:
{
"code":"xxx",
"title":"This is the title of the first series"
"type":"PERIODIC",
"period":"WEEKLY", <-- PERIOD
"from":"2015-08-02",
"to":"2015-08-29",
"labels": ["2015-08-02", "2015-08-09", "2015-08-16", "2015-08-23"],
"tabelType": "TEXT",
"series":[
{
"code":"xxx",
"title":"This is the title of the first series"
"values":[10, 0, 13, 18] <- in this example, we don't have values for label "2015-08-09"
},
{
"code":"xxx",
"title":"This is the title of the second series"
"values":[10, 0, 13, 18] <- in this example, we don't have values for label "2015-08-09"
}
]
}
In Postgres wird diese mit in der Regel getan [SELECT ... FROM generate_series (timestamp_from, timestamp_to, Intervall) AS int_start JOIN your_data ON your_data.timestamp_col BETWEEN int_start AND int_start + interval'] (https://www.postgresql.org/docs/current/static/functions-srf.html), aber ich kann mir keine JPA freundliche Art vorstellen (andere) als native Abfragen verwenden). – pozs
@ Pozs, ja, wie dies auf JPA zu tun ist der schwierigste Teil. Ich dachte daran, vielleicht eine Ansicht zu verwenden, die einer JPA-Entität zugeordnet ist, aber ich weiß nicht, ob das funktionieren wird. –