为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

汪汪一只猫 2021-11-17 15:34:12
我从数据库中下载记录时遇到问题,该数据库中的日期形式如下: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 回答

?
不负相思意

TA贡献1777条经验 获得超10个赞

您使用的是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/


查看完整回答
反对 回复 2021-11-17
?
慕姐8265434

TA贡献1813条经验 获得超2个赞

这发生在 PostgreSQL 和使用 Hibernate 并且参数值为 null 时。避免它的一种方法是使用非空值告诉它类型是什么。

有一些静态常量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,因为本质上你是在问anything <= NULL哪个定义是假的,这意味着没有行会匹配。


查看完整回答
反对 回复 2021-11-17
  • 2 回答
  • 0 关注
  • 371 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信