2012-12-12 3 views
5

Ho una colonna destinata a contenere un timestamp definito con un tipo di dati java.util.Date e memorizzato in un tipo di Oracle DATE nel database. Ho verificato che le informazioni complete su data e ora siano persistenti e recuperate correttamente dal database, ma quando provo a confrontarle in un NamedQuery, le informazioni sull'ora non vengono prese in considerazione nel confronto.JPA: Confronto di data/ora in NamedQuery: dati di tempo persi

La colonna è definito come segue (analyzeDate è di tipo java.util.Date):

@Basic(optional = false) 
@Column(name = "ANALYZE_DATE") 
@Temporal(TemporalType.TIMESTAMP) 
private Date analyzeDate; 

E il mio NamedQuery:

@NamedQuery(name = "BOADocument.findByBeforeAnalyzeDate", 
    query = "SELECT b FROM BOADocument b WHERE b.companyId = :companyId AND b.analyzeDate < :analyzeDate") 

che ho poi eseguo, passando analyzeDate che è di digita java.util.Date:

List<BOADocument> docs = em.createNamedQuery("BOADocument.findByBeforeAnalyzeDate") 
      .setParameter("companyId", clientRecord) 
      .setParameter("analyzeDate", analyzeDate, TemporalType.TIMESTAMP) 
      .getResultList() 

Ritorna un elenco di tutte le righe nella tabella Documento , sebbene abbiano tutti esattamente lo stesso valore per analyzeDate come il valore che ho impostato come parametro per NamedQuery.

Se inverso il confronto, non ottengo linee, ulteriormente convincendomi che la porzione temporale del timestamp si sta perdendo sul lato b.analyzeDate delle cose, non sul lato: analizza Data.

Sto utilizzando JPA 1.0 con Hibernate 3.5.

Questo mi ostacola, e sono vicino a rinunciare e usare una query nativa, ma mi sembra di imbrogliare!

+0

Potrebbe essere un problema di millisecondi, controllare il loro valore nei parametri e nei valori del database. – remigio

+0

Poiché il tipo di colonna nel database Oracle è DATE, non vi sono informazioni millisecondo memorizzate. Le informazioni del millisecondo sono presenti nel lato java.util.Date, quindi ho controllato (confrontando sia Date.getTime()) sia il valore che ho inserito e i valori che ottengo dalle mie entità sono identici. Ancora stumped ... – emilys

risposta

3

Risulta che il sottostante Il tipo Oracle deve essere TIMESTAMP

DATA contiene ora, minuto e secondo informazioni.Questa è abbastanza precisione per i miei scopi, quindi stavo pensando di usarlo al posto di TIMESTAMP, che detiene anche millisecondi. recupero dell'ora, dei minuti e delle seconde informazioni su e da DATE funzionava perfettamente, ma non i confronti basati sui dati temporali nelle query denominate.

Ho modificato il tipo di colonna del database e voilà, il codice come scritto in precedenza. Naturalmente ottengo anche i millisecondi, ma questo non presenta effetti collaterali nel mio codice.

1

modificare la query come seguendo uno

SELEZIONA b FROM BOADocument b WHERE b.companyId =: CompanyID E CAST (b.analyzeDate AS TIMESTAMP) <:. AnalyzeDate"

+0

Quello sembrerebbe avere un senso, ma ahimè, quello non cambiò nulla. Ho notato che è pignolo per il caso: il timestamp deve essere in minuscolo. Mi ha permesso di vedere come impiegare il CAST, però! – emilys

Problemi correlati