Pregunta

con SQL nativo obtengo la hora de la base de datos con una declaración como:

SELECT CURRENT_TIMESTAMP

con JPQL obtengo el mismo resultado con:

SELECT CURRENT_TIMESTAMP
FROM Customer c
WHERE c.id=1

¿Hay alguna manera de deshacerse de las dos últimas líneas?

gracias,

¿Fue útil?

Solución

De acuerdo con la JSR 220:JavaBeans empresariales 3.0 especificaciones:

4.6.16 Expresiones funcionales

El lenguaje de consulta de persistencia Java incluye las siguientes funciones integradas, que se puede usar en el lugar o la cláusula de una consulta.

Si el valor de cualquier argumento a una expresión funcional es nulo o desconocido, se desconoce el valor de la expresión funcional.

[...]

4.6.16.3 Funciones de fecha y hora

functions_returning_datetime:=
             CURRENT_DATE |
             CURRENT_TIME |
             CURRENT_TIMESTAMP

Las funciones de DateTime devuelven el valor de la fecha, hora y marca de tiempo actuales en el servidor de la base de datos.

Así que ya me sorprende que puedas escribir el segundo formulario que no es correcto según las especificaciones y, por lo tanto, podría no ser portátil.

Para mí, la forma "correcta" de hacer esto sería crear una clase con un campo de fecha de tipo java.util.Date y rellenarlo con una consulta nativa.Algo como eso:

import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

@Entity
public class DateItem {
    private Date date;

    /**
     * @return the date
     */
    @Id
    @Column(name = "DATE_VALUE")
    @Temporal(TemporalType.TIMESTAMP)
    public Date getDate() {
        return date;
    }

    /**
     * @param date
     *            the date to set
     */
    public void setDate(Date date) {
        this.date = date;
    }
}

Y luego:

@PersistenceContext
EntityManager em;

/**
 * @return System date on DB server
 */
public Date getSystemDate() {
    Query query = em.createNativeQuery(
            "SELECT CURRENT_TIMESTAMP", DateItem.class);
    DateItem dateItem = (DateItem) query.getSingleResult();
    return dateItem.getDate();
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top