HQL не возвращает значения, даже если сгенерировано SQL - PullRequest
1 голос
/ 12 января 2020

Я столкнулся с этой несколько странной проблемой. (Может я не понимаю). У меня есть следующий запрос HQL.

"select distinct b " +
"from Booking b " +
"inner join fetch b.telephoneNumber tp " +
"left join fetch tp.patients p " +
"where b.concluded = false and b.schedule.doctor.id = :did and b.bookingDate = :date";

со следующими параметрами.

query.setParameter("did", doctor.getId());
query.setParameter("date", date);

Здесь date является Java LocalDate. Когда я вызываю query.getResultList(), он не возвращает никаких значений. (Даже если есть значения, соответствующие заданным критериям). Затем я включил журналы отладки и трассировки гибернации, чтобы получить связанный запрос SQL и значения.

select distinct booking0_.id as id1_1_0_, telephonen1_.id as id1_11_1_, patient3_.id as id1_4_2_, booking0_.bookingDate as bookingD2_1_0_, booking0_.bookingReference as bookingR3_1_0_, booking0_.bookingUniqueId as bookingU4_1_0_, booking0_.channelRecord_id as channelR7_1_0_, booking0_.checkedIn as checkedI5_1_0_, booking0_.checkedInPatient_id as checkedI8_1_0_, booking0_.concluded as conclude6_1_0_, booking0_.schedule_id as schedule9_1_0_, booking0_.telephone_number_id as telepho10_1_0_, telephonen1_.isActive as isActive2_11_1_, telephonen1_.number as number3_11_1_, telephonen1_.securityToken as security4_11_1_, telephonen1_.token_id as token_id6_11_1_, telephonen1_.uniqueId as uniqueId5_11_1_, patient3_.birthDay as birthDay2_4_2_, patient3_.firstName as firstNam3_4_2_, patient3_.gender as gender4_4_2_, patient3_.height as height5_4_2_, patient3_.lastName as lastName6_4_2_, patient3_.picture as picture7_4_2_, patient3_.pictureContentType as pictureC8_4_2_, patient3_.weight as weight9_4_2_, patients2_.telephonenumber_id as telephon2_5_0__, patients2_.patient_id as patient_1_5_0__
from Booking booking0_
    left outer join TelephoneNumber telephonen1_ on booking0_.telephone_number_id=telephonen1_.id
    left outer join Patient_TelephoneNumber patients2_ on telephonen1_.id=patients2_.telephonenumber_id
    left outer join Patient patient3_ on patients2_.patient_id=patient3_.id
    cross join Schedule schedule4_
where booking0_.schedule_id=schedule4_.id and booking0_.concluded=0 and schedule4_.doctor_id=? and booking0_.bookingDate=?

2020-01-12 18:58:34 TRACE binding parameter [1] as [BIGINT] - [1]
2020-01-12 18:58:34 TRACE binding parameter [2] as [DATE] - [2020-01-12]

Так что, если добавить эти значения к сгенерированному SQL и выполнить запрос к БД напрямую, это даст мне два результата (Ожидается).

И всякий раз, когда я удаляю значение date из HQL, оно также дает результаты. Есть мысли о том, почему это происходит?

Версия Hibernate: 5.4.9.Final

DB: Mysql 8

Java 11 (Open JDK)

WildFly 18.

Спасибо!

1 Ответ

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

Причиной этого была проблема TimeZone. Мой сервер приложений и сервер БД находились в двух разных часовых поясах. Поэтому всякий раз, когда вы пытаетесь получить через JDB C, он преобразует вашу дату в часовой пояс БД из-за этого [1].

Но прямой SQL работает так же, как и на сервере БД, и нет проблемы часового пояса.

Итак, мой первоначальный подход заключался в добавлении следующего свойства к URL-адресу соединения (как предложено в ошибке [1]). И это сработало.

serverTimezone=<client_time_zone>

Однако в качестве постоянного решения я изменил часовой пояс сервера БД на часовой пояс сервера приложений. (Я знаю, что UT C - правильный путь, но я предпочитаю это.)

[1] https://bugs.mysql.com/bug.php?id=91112

...