2011-11-18 24 views
6

Aquí está una versión mínima del código que me llevó mucho tiempo para averiguar por qué no está funcionando: eraHibernateException con setTimestamp pero trabaja con setParameter

Query q = session.createQuery(queryString); 
q.setTimestamp(0, new java.util.Date()); 

 

El error:

Unset positional parameter at position: 0 

 

Cuando reemplacé setTimestamp() con setParameter():

Query q = session.createQuery(queryString); 
q.setParameter(0, new java.util.Date()); 

 

y funcionó, pero no puedo entender por qué. Estoy usando hibernate 3.2.1.

EDITAR: ¿De dónde salió la publicación con la otra sugerencia? ¡¡Esto fue!!

+0

¿cómo se ve la cadena de consulta? – Casey

+0

Fue '" de Aplicaciones s donde s.validHasta entre? Y? "' (HQL). Ambos eran en realidad de un objeto 'Calendar' usando' cal.getTime() 'pero para hacerlo simple, simplemente incluí un objeto' Date'. El error permanece igual en ambos sentidos. – Raidok

Respuesta

1

Hubo una respuesta aquí anteriormente que sugería usar java.sql.Timestamp en lugar de java.util.Date. Con esta pequeña modificación, el método setTimestamp funciona como se esperaba.

+0

Timestamp está en desuso a partir de JDK 1.1 – abbas

0

En su mapeo puede que tenga que añadir la siguiente anotación a la variable que mantiene la marca de tiempo

@Temporal(TemporalType.TIMESTAMP)

que podría ser la razón por setParameter está trabajando (sólo se necesita un objeto) y setTimestamp no es .

+0

No creo que sea esto. El campo es tipo 'timestamp' ya. De lo contrario, dudo que funcione con 'setParameter()' tampoco. – Raidok

+0

No necesariamente. Sin la anotación @Temporal, Hibernate trata el campo como FECHA. Al llamar a setParameter, vincula una instancia de Date a un campo de tipo DATE. Todo está bien. Con setTimestamp, enlaza un objeto Timestamp con un campo DATE. Eso no es lo mismo. ¿Al menos has probado esta solución? –

Cuestiones relacionadas