Собственные запросы JPA не работают при использовании обнуляемого типа Kotlin из-за ошибки приведения байтов - PullRequest
0 голосов
/ 22 января 2019

Я использую Kotlin, Spring Boot и Spring Data с Hibernate и Postgresql.

Мы создали класс репозитория, который расширяет JpaRepository и только что обнаружили, что нативные запросыне работают, если указан параметр NULL.

В этом примере параметр isInternal может быть истинным, ложным или нулевым, если мы еще не знаем эту информацию (как в нашей базе данных).

    @Query(
        nativeQuery = true,
        value = "SELECT * FROM story WHERE is_internal = :isInternal",
        countQuery = "SELECT COUNT(*) FROM story WHERE is_internal = :isInternal"
    )
    fun findEmployeeStories(
        @Param("isInternal") isInternal: Boolean?,
        pageable: Pageable
    ): Page<StoryEntity>

Этот запрос приводит к:

org.postgresql.util.PSQLException: ERROR: operator does not exist: boolean = bytea
  Hint: No operator matches the given name and argument type(s). You might need to add explicit type casts.

Если мы попытаемся добавить явное приведение, ошибки будут изменены.

    @Query(
        nativeQuery = true,
        value = "SELECT * FROM story WHERE is_internal = CAST(:isInternal AS boolean)",
        countQuery = "SELECT COUNT(*) FROM story WHERE is_internal = CAST(:isInternal AS boolean)"
    )
    fun findEmployeeStories(
        @Param("isInternal") isInternal: Boolean?,
        pageable: Pageable
    ): Page<StoryEntity>

Этот запрос приводит к:

org.postgresql.util.PSQLException: ERROR: cannot cast type bytea to boolean

Если мы изменим @Param("isInternal") isInternal: Boolean? на @Param("isInternal") isInternal: Boolean (чтобы запретить обнуляемые значения), он будет работать нормально, но мы этого не хотим.

Выше приведен простой пример воспроизведения проблемы.Наш запрос сложный, поэтому мы попытались переключиться на собственный запрос вместо использования JQL (там, где таких проблем нет).

Спасибо

...