【问题标题】:How to concatenate DATE and TIME to form DATETIME (TIMESTAMP) in a JPA query?如何在 JPA 查询中连接 DATE 和 TIME 以形成 DATETIME (TIMESTAMP)?
【发布时间】:2015-06-02 18:22:41
【问题描述】:

我在数据库中有两个字段来存储日期和时间。前者将其时间部分设置为零,而后者将其日期部分设置为空(即 1970/1/1)。天知道为什么原来的开发者会这样,我也换不了表。在 JPA 查询中,我需要将 Timestamp 与这两个字段进行比较,就好像它们是一个 DateTime 字段一样。在 SQL Server 中,我会这样做:

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

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

【问题讨论】:

    标签: java hibernate datetime jpa


    【解决方案1】:

    为什么不保持这种方式,我的意思是,如果你不能改变结构然后使用参数拆分,你可以明确如果你使用带参数的 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();
    

    那么在你的实体中,你只需要一个额外的方法,它会产生你想要的价值 当您拥有结果列表时,您可以使用此 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)
    

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

    【讨论】:

    • 我明白你的意思,但问题是如何使用 DateTimes 之间的日期选择记录范围。如果我对日期使用一个 where 子句,对时间使用另一个子句,我会得到一组不同的记录(我将获取日期 X 和 Y 之间每一天的时间 A 和 B 之间的所有记录,而不是 X+A 和 Y 之间的所有记录+B)。我以与您的建议类似的方式“解决”了该问题:我仅按日期获取记录,然后在结果列表上应用时间过滤器(在 jpa qyery 之外)。所以+1。
    • @RafaelDiasdaSilva 我已经更新了我的答案以解决日期之间的问题
    猜你喜欢
    • 2011-04-25
    • 1970-01-01
    • 1970-01-01
    • 2012-09-02
    • 2010-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多