Java 即使生成的SQL返回值,HQL也不会返回值

Java 即使生成的SQL返回值,HQL也不会返回值,java,hibernate,hql,Java,Hibernate,Hql,我面临着这个有点奇怪的问题。(也许我不明白)。我有以下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"; 使用以下参数 q

我面临着这个有点奇怪的问题。(也许我不明白)。我有以下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()
时,它不会返回任何值。(即使存在与给定条件匹配的值)。然后,我启用了hibernate调试和跟踪日志,以获取相关的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中并直接对DB运行查询,将得到两个结果(预期结果)

每当我从HQL中删除“date”值时,它也会给出结果。你有没有想过为什么会这样

Hibernate版本:5.4.9.Final

数据库:Mysql 8

Java 11(开放JDK)

野蝇18


谢谢

这背后的原因是时区问题。我的应用服务器和数据库服务器位于两个不同的时区。因此,每当您尝试通过JDBC检索时,它都会将您的日期转换为DB时区,原因如下[1]

但是,直接SQL在DB服务器上运行,没有时区问题

因此,我最初的方法是将以下属性添加到连接URL(如[1]bug中所建议的)。它成功了

serverTimezone=<client_time_zone>
serverTimezone=
但是,作为永久解决方案,我将DB服务器时区更改为应用服务器时区。(我知道UTC是正确的方式,但我更喜欢这种方式。)


[1] 这背后的原因是时区问题。我的应用服务器和数据库服务器位于两个不同的时区。因此,每当您尝试通过JDBC检索时,它都会将您的日期转换为DB时区,原因如下[1]

但是,直接SQL在DB服务器上运行,没有时区问题

因此,我最初的方法是将以下属性添加到连接URL(如[1]bug中所建议的)。它成功了

serverTimezone=<client_time_zone>
serverTimezone=
但是,作为永久解决方案,我将DB服务器时区更改为应用服务器时区。(我知道UTC是正确的方式,但我更喜欢这种方式。)


[1]

如果使用HQL无法得到可接受的答案,您可以始终运行本机查询。@TimBiegeleisen感谢您的建议。我会把它作为我的最后手段。另一件奇怪的事情是,我有两个环境,唯一的区别是这些环境是Java minor版本、MySQL minor、OS(Mac和Ubuntu)和Wildfly 17。相同的HQL在Wildfly 17环境中工作,但在此环境中不工作。(所有工件都和我复制粘贴的一样。)@JayangaKaushalya:你有可能在数据库中存储了日期时间值吗?因为如果在没有时间的情况下在日期上加上等号,则查询不会返回结果。如果使用HQL无法得到可接受的答案,则可以始终运行本机查询。@TimBiegeleisen感谢您的建议。我会把它作为我的最后手段。另一件奇怪的事情是,我有两个环境,唯一的区别是这些环境是Java minor版本、MySQL minor、OS(Mac和Ubuntu)和Wildfly 17。相同的HQL在Wildfly 17环境中工作,但在此环境中不工作。(所有工件都和我复制粘贴的一样。)@JayangaKaushalya:你有可能在数据库中存储了日期时间值吗?因为如果您在日期上加上等号而不加时间,则查询不会返回结果。