Domanda

Sto cercando come eseguire la matematica di data / ora all'interno di una query HQL. In particolare, come posso aggiungere o sottrarre una quantità di tempo (x) dal risultato della funzione current_timestamp () ? Oppure devo passare a SQL per questo e sperare che qualunque database sia in esecuzione lo supporti?

Esempio di query HQL:

FROM RandomThing
WHERE randomTime IS NOT NULL AND
      randomTime >= current_timestamp() AND
      randomTime <= (current_timestamp() + :timeToAdd)

Posso definire il parametro: timeToSubtract come qualsiasi unità particolare, sebbene qualcosa di più grande delle ore sarebbe indesiderabile e i secondi sarebbero più desiderabili.

CHIARIMENTO: mi rendo conto che questo può essere fatto facilmente al di fuori della query. Ma per motivi filosofici, supponiamo che sia importante utilizzare l'ora del server di database, anziché l'ora del sistema di query. Esempio pratico: sto richiedendo un timestamp automatico per tutte le voci effettuate nell'ultimo (x) periodo di tempo. Poiché il timestamp viene creato dal sistema di database, è importante utilizzare anche l'ora corrente del database.

È stato utile?

Soluzione

Se hai bisogno del tempo del server database, puoi prima fare una semplice query hql per ottenere il timestamp, quindi calcolare il maxTimestamp in Java e passare il timestamp recuperato e il maxTimeStamp calcolato a una query come quella di ccclark.

Altri suggerimenti

Perché è necessario farlo nella query? Perché non gestirlo semplicemente nel codice Java.

ad esempio:

From RandomThing
Where randomTime is not null and
      randomTime >= :currentTimestamp and
      randomTime <= :maxTimestamp

E poi basta impostare i parametri.

È possibile determinare la sintassi per farlo utilizzando SQL nel database e quindi definire una funzione all'interno di un HibernateDialect personalizzato. Ad esempio, avevamo bisogno di una funzione nei giorni feriali che non sia SQL standard. Abbiamo sottoclassato il dialetto per ciascun database e quindi aggiunto una riga come questa:

registerFunction("weekday", 
  new SQLFunctionTemplate(Hibernate.INTEGER, "to_char(?1,'D')") );

Nel tuo caso, potresti usare una funzione chiamata date_diff che potrebbe essere definita come? -? in alcuni database o qualcosa di diverso in altri. In questo modo non è necessario scrivere SQL grezzo nella query e, se mai è necessario cambiare database, è sufficiente mappare la funzione in modo diverso nel dialetto.

Deve essere HQL? Vorrei probabilmente passare a un criterio di ibernazione e utilizzare:

Criteria.add( Restrictions.SQLRestriction( "{alias} <= current_timestamp() " ) )
Criteria.add( Restrictions.SQLRestriction( "{alias} >= (current_timestamp() + ?) ", 5 )
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top