Проблема со сравнением java.time.LocalDate с датой postgres - PullRequest
0 голосов
/ 14 октября 2018

У меня проблема с загрузкой записи из базы данных, для которой дата в форме в базе данных выглядит следующим образом: 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 голосов
/ 15 октября 2018

Это происходит в PostgreSQL при использовании Hibernate, а значение параметра равно нулю.Один из способов избежать этого - сообщить ему, какой тип использует ненулевое значение.

Имейте некоторую статическую константу 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, что по определению является ложным, то есть строки не будут совпадать.

0 голосов
/ 14 октября 2018

Вы используете LocalDate в качестве параметра: day, но ваш entityManager понимает только java.util.Date.Вы можете конвертировать следующим образом:

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

Релиз JPA 2.2 действительно поддерживает новый API даты.https://vladmihalcea.com/whats-new-in-jpa-2-2-java-8-date-and-time-types/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...