Pergunta

com SQL nativo eu chegar a tempo banco de dados com uma declaração como:

SELECT CURRENT_TIMESTAMP

com JPQL eu obter o mesmo resultado com:

SELECT CURRENT_TIMESTAMP
FROM Customer c
WHERE c.id=1

Existe uma maneira de se livrar das duas últimas linhas?

graças,

Foi útil?

Solução

De acordo com os JSR 220: Especificações 3,0 Enterprise JavaBeans:

4.6.16 Expressões funcionais

O Java Persistence linguagem de consulta inclui os seguintes embutido funções, que pode ser usado na Cláusula WHERE ou HAVING de uma consulta .

Se o valor de qualquer argumento para uma expressão funcional é nulo ou desconhecido, o valor do funcional expressão é desconhecido.

[...]

4.6.16.3 Funções de data e hora

functions_returning_datetime:=
             CURRENT_DATE |
             CURRENT_TIME |
             CURRENT_TIMESTAMP

As funções de data e hora devolver o valor de data, hora e timestamp no servidor de banco de dados.

Então, eu já estou surpreso que você pode escrever a 2ª forma que não está correto por especificação e, portanto, não pode ser portátil.

Para mim, a maneira "certa" de fazer isso seria criar uma classe com um campo de data do tipo java.util.Date e para preenchê-lo com uma consulta nativa. Algo assim:

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;
    }
}

E, em seguida:

@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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top