【问题标题】:How to compare timestamp with date without time in JPQL?如何在 JPQL 中将时间戳与没有时间的日期进行比较?
【发布时间】:2015-01-30 20:14:18
【问题描述】:

我想获取带有create_date = :my_date 的对象,其中create_date2014-12-02 14:49:15.029 格式,my_date 是JPA 中的2014-12-02 格式。

有什么方法可以使用NamedQuery 将时间戳列与 JPQL 中的 Date 对象(yyyy-MM-dd 格式)进行比较,或者我应该使用本机查询吗?

【问题讨论】:

    标签: jpa jboss jpql


    【解决方案1】:

    如果你正在使用 jpql 尝试使用

    date(timestamp_column) 
    

    例如:

    @Query(select te from Testentity te where date(te.createdTimestamp) >= CURRENT_DATE)
     public List<Testentity> getTestDate() 
    

    【讨论】:

    • 谢谢你拯救我的一天:)
    • 永远欢迎 :)
    【解决方案2】:

    可以使用NamedQuery,需要正确操作@Temporal注解和TemporalType枚举。

    因此,如果您的对象属性是没有时间部分的日期,您可以将其注释为 @Temporal(TemporalType.DATE),然后在为命名查询提供参数时,您将使用两个可用签名之一

    setParameter(String name, java.util.Date value, TemporalType temporalType)
    setParameter(String name, java.util.Calendar value, TemporalType temporalType)
    

    所以您的查询将包含如下部分:

    query.setParameter("my_date", myDate, TemporalType.DATE)
    

    【讨论】:

    • 但是如果我不想添加这个注释呢?我使用这个属性的时间,但只有在这个查询中,时间对我来说并不重要。我尝试使用 TemporalType.DATE 设置参数,但生成的 SQL 没有将时间戳列转换为日期。
    • 对于转换,底层 SQL 类型是 TIMESTAMP 还是 DATE,或者换种说法,请确保在您的数据库中该列的类型为 TIMESTAMP
    • 我确定该列是时间戳。这花了我太多时间,我将使用本机查询代替。感谢您的回复。
    • 我已经测试了 id 并且你的方法有帮助,但不幸的是我不想使用这个 @Temporal 注释。
    • 当@Temporal(TemporalType.TIMESTAMP) 用于实体中的列定义时,这不起作用。您对此案没有解决方案吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-23
    • 1970-01-01
    • 1970-01-01
    • 2020-04-22
    • 2017-05-04
    • 1970-01-01
    相关资源
    最近更新 更多