JPA Native Query Date сравнивает броски - PullRequest
0 голосов
/ 15 ноября 2018

Я использую Spring boot + jpa + H2 для этого проекта.

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

Я очень озадачен этой ошибкой, потому что я работаю только с объектами Date в Java, и я сохранил даты точно так же, как и Dates в базе данных. Но в консоли похоже, что он пытается обработать его как VARCHAR.

Это мой класс модели:

package com.campsite.reservations.model;
imports

@Entity
@Table(name = "reservations")
public class Reservation {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;

    @Column(name = "reservation_code")
    private String reservationCode;

    @Column(name = "user_id")
    private long userId;

    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="place_id")
    private Place place;

    @Column(name = "date_from")
    private Date dateFrom;

    @Column(name = "date_to")
    private Date dateTo;

GETTERS Y SETTER`S

}

А это мой репозиторий. Запрос:

 @Query(
                value = "select * FROM Reservations res "+
                "where  ((res.date_from >= ?1 || res.date_from <= ?2) "+
                 "|| (res.date_to >= ?1 || res.date_to <= ?2))",
                nativeQuery = true)
        List<Reservation> findOverlapings(Date dateFrom, Date dateTo);

Я использую загрузку Spring, поэтому моя консоль выглядит немного плохо. Консольные сообщения:

2018-11-15 02:44:19.227 DEBUG 9201 --- [nio-8090-exec-1] m.m.a.RequestResponseBodyMethodProcessor : Read [class com.campsite.reservations.model.Reservation] as "application/json;charset=UTF-8" with [org.springframework.http.converter.json.MappingJackson2HttpMessageConverter@5b5b53c6]
2018-11-15 02:44:24.271  INFO 9201 --- [nio-8090-exec-1] o.h.h.i.QueryTranslatorFactoryInitiator  : HHH000397: Using ASTQueryTranslatorFactory
Hibernate: select reservatio0_.id as id1_1_, reservatio0_.date_from as date_fro2_1_, reservatio0_.date_to as date_to3_1_, reservatio0_.place_id as place_id6_1_, reservatio0_.reservation_code as reservat4_1_, reservatio0_.user_id as user_id5_1_ from reservations reservatio0_ left outer join places place1_ on reservatio0_.place_id=place1_.id where place1_.id=? and reservatio0_.date_from=? and reservatio0_.date_to=?
Hibernate: select * FROM Reservations res where  ((res.date_from >= ? || res.date_from <= ?) || (res.date_to >= ? || res.date_to <= ?))
2018-11-15 02:44:27.595  WARN 9201 --- [nio-8090-exec-1] o.h.engine.jdbc.spi.SqlExceptionHelper   : SQL Error: 22007, SQLState: 22007
2018-11-15 02:44:27.598 ERROR 9201 --- [nio-8090-exec-1] o.h.engine.jdbc.spi.SqlExceptionHelper   : Cannot parse "TIMESTAMP" constant "2018-11-01 21:00:00.02018-10-31 21:00:00.0"; SQL statement:
select * FROM Reservations res where  ((res.date_from >= ? || res.date_from <= ?) || (res.date_to >= ? || res.date_to <= ?)) [22007-196]
2018-11-15 07:51:26.564 DEBUG 11342 --- [nio-8090-exec-1] o.s.w.s.m.m.a.HttpEntityMethodProcessor  : Written [CampsiteErrorResponse{status=500, message='could not extract ResultSet; SQL [n/a]; nested exception is org.hibernate.exception.DataException: could not extract ResultSet', errors=[could not extract ResultSet; SQL [n/a]; nested exception is org.hibernate.exception.DataException: could not extract ResultSet]}] as "application/json" using [org.springframework.http.converter.json.MappingJackson2HttpMessageConverter@2b2b7e3c]

1 Ответ

0 голосов
/ 15 ноября 2018

Посмотрите на это в Reservation классе:

@Column(name = "date_from")
private Date dateFrom;

@Column(name = "date_to")
private Date dateTo;

Прежде всего, вам не хватает указать @Temporal аннотацию в вашем классе сущности.Измените на:

@Column(name = "date_from")
@Temporal(TemporalType.DATE)
private Date dateFrom;

@Column(name = "date_to")
@Temporal(TemporalType.DATE)
private Date dateTo;

Если вы используете репозиторий данных Spring, я бы порекомендовал вам воспользоваться JpaRepository и использовать такой метод запроса:

Collection<Reservation> findByDateFromBetweenOrDateToBetweenOrder(Date dateFrom, Date dateTo);

Надеюсь, это поможет.

...