如何连接DATE和TIME以在JPA查询中形成DATETIME(TIMESTAMP)?

时间:2015-06-02 18:22:42

标签: java hibernate datetime jpa

我在数据库中有两个字段来存储日期和时间。前者将其时间部分设置为零,后者将其日期部分设置为空(即1970/1/1)。上帝只知道为什么原始开发者这样做了,我无法改变表格。在JPA查询中,我需要将时间戳与这两个字段进行比较,就好像它们是一个单独的DateTime字段一样。在SQL Server中我会做这样的事情:

select CONVERT(DATETIME, CONVERT(CHAR(10), Date_Field, 121) + ' ' + CONVERT(CHAR(8), Time_Field, 108)) from MyTable

有没有办法在JPA查询中连接这两个字段,以便我可以将它们与完整的DateTime进行比较?

1 个答案:

答案 0 :(得分:0)

为什么不保持这种方式,我的意思是,如果你不能改变结构然后使用参数split,你可以明确你是否使用带参数的JPA查询: 进行查询

entityManager.createQuery("SELECT o FROM Object o WHERE o.date = :date AND o.time = :time", Object.class)
.setParameter("date", localDateTime.toDate())
.setParameter("time", localDateTime.toTime())
.getResultList();

然后在您的实际情况中,您只需要一个额外的方法,它将根据您的需要生成价值 当您有结果列表时,tou可以访问具有此bean属性的值

@Transient //Only necesary if you are declaring the annotations at method level, not if they are in the variable
public DateTime getDateTime() {
    return new DateTime();//Build with the values dateTime and time
}

关于你的日期问题,其他方式(可怕的,我知道,但它有效)可能是:

SELECT r FROM Registry r Where
(r.date = :startDate AND r.time >= :startTime)
OR (r.date = :finalDate AND r.time <= :finalTime)
OR (r.date > :startDate AND r.date < :endDate)

这个查询中的好处是它仍然在db中被过滤,避免了JPA中的trasnporting和转换数据