Исключение: org. postgresql .util.PSQLException: ОШИБКА: невозможно привести тип bigint к интервалу - PullRequest
0 голосов
/ 17 января 2020

Я новичок в Spring Framework.

Я использую hibernate-типы для приведения интервала PostgreSQL в Java Duration Object.

Для выбора все строки это работает нормально. Я создал модель данных для указанной таблицы c и использовал аннотацию TypeDef для отображения:

@Entity
@Table(name = "test")
@Typedef(
    typeClass = PostgreSQLIntervalType.class,
    defaultForType = Duration.class
)
@Getter @Setter
public class Test {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int id;

    private Duration flightDuration;
}

Но теперь я хочу создать собственный собственный запрос. Я хочу выбрать все строки из таблицы Test, где flightDuration представляет собой RequestParam веб-службы. Например, в качестве базового c (реальный запрос гораздо более сложный и требует некоторых специальных postgres функций):

public interface TestRepository extends JpaRepository<Test, int> {

    @Query( value = SELECT * FROM test t WHERE flight_duration = ?1 , nativeQuery = true )
    List<Test> findByFlightDuration(Duration flightDuration);

}

Но вот моя проблема. Я не знаю, как использовать PostgreSQLIntervalType для приведения Длительности в интервал PostgreSQL.

Если я выполню запрос, как описано выше, я получу следующую ошибку:

org.postgresql.util.PSQLException: ERROR: cannot cast type bigint to interval

Так что, где я должен установить аннотацию (или что-то еще), как TypeCast в Тестовый класс, что Duration будет приведен к PostgreSQLIntervalType?

Ответы [ 2 ]

0 голосов
/ 17 января 2020

Если вам ДЕЙСТВИТЕЛЬНО нужен nativeQery, потому что он вам нужен, то вам нужно привести целое число в вашем запросе к интервалу PostgreSQL.

Я полагаю, вы предоставляете секунды в своем запросе, и ?1 - количество секунд, которое займет ваш рейс. Попробуйте следующее:

@Query(value = SELECT * FROM test t WHERE flight_duration = (?1 || ' secs') , nativeQuery = true )
List<Test> findByFlightDuration(int flightDurationInSec);

Более подробная информация здесь: https://www.postgresql.org/message-id/Pine.LNX.4.44.0410051443550.13144-100000@matrix.gatewaynet.com

Но я предлагаю вам проверить, действительно ли вам это нужно или нет. Может быть, вы можете попробовать с JPQL. Дайте нам знать.

0 голосов
/ 17 января 2020

Нет причин использовать собственный запрос. Вы можете просто JPQL.

@Query( value = "FROM test t WHERE flight_duration = ?1")
List<Test> findByFlightDuration(Duration flightDuration);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...