将java.time.LocalDate与Postgres日期进行比较的问题

时间:2018-10-14 17:56:14

标签: java postgresql kotlin

我在从数据库中下载记录时遇到问题,该记录的日期以数据库的形式如下:2018-10-14(日期)

此字段的数据库结构如下:next_day DATE NOT NULL

调用findDay方法时,将引发异常:

Caused by: org.postgresql.util.PSQLException: ERROR: operator does not exist: date <= bytea

一种方法:

open fun findDay(day: LocalDate) : Day {
val sql = "SELECT bbd FROM com.test.entity.Day d WHERE d.nextDay <= :nextDay ORDER BY d.nextDay DESC"
val query: TypedQuery<Day> = entityManager.createQuery(sql, Day::class.java)
            query.setParameter("nextDay", day)
            query.maxResults = 1
    return query.singleResult
}

实体:

@Entity(name="day")
open class Day {

    @Id
     var id: Long? = null

    @Column(name = "next_day")
    var nextDay: LocalDate? = null
}

我是否可以从数据库中获取行?

2 个答案:

答案 0 :(得分:1)

您正在使用LocalDate作为参数:day,但是您的entityManager只理解java.util.Date。您可以这样转换:

Date date = Date.from(day.atStartOfDay(ZoneId.systemDefault()).toInstant()); 

JPA 2.2版本确实支持新的Date API。 https://vladmihalcea.com/whats-new-in-jpa-2-2-java-8-date-and-time-types/

答案 1 :(得分:0)

在使用Hibernate并且参数值为null的PostgreSQL中会发生这种情况。避免出现这种情况的一种方法是通过使用非null值告诉它什么类型。

具有一些静态常量sqrt(pow(table2.x-table1.x,2) + pow(table2.y-table1.y,2) + pow(table2.z-table1.z,2) + pow(table2.t-table1.t,2)) 作为优化,以避免在每次调用时进行所有检查和分配。

EPOCH = LocalDate.of(1970, 1, 1)

当然,这会抛出val query: TypedQuery<Day> = entityManager.createQuery(sql, Day::class.java) query.setParameter("nextDay", EPOCH) query.setParameter("nextDay", day) query.maxResults = 1 return query.singleResult ,因为本质上您是在问NoResultException,根据定义,这是错误的,这意味着没有行会匹配。