Como obter o tempo de banco de dados com JPQL?
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,
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 ??strong>.
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();
}