迁移到 MySQL 8 后,Hibernate Criteria 查询不适用于日期时间列

Hibernate Criteria query does not work with datetime columns after migration to MySQL 8

将我们的数据库从 MySQL 5.7 迁移到 8.0 后,我们注意到包含日期时间列的查询无法正常工作,尤其是在进行相等比较时。

迁移前有效的代码如下:

Criteria crit = dao.getSession().createCriteria(IncidenceEntity.class);
crit.createAlias("event", "event");
crit.add(Restrictions.eq("creationDate", creationDate));
crit.add(Restrictions.eq("event.id", event));
IncidenceEntity result = (IncidenceEntity) crit.uniqueResult();

当我们没有实体 ID 时使用,因此我们搜索特定的相同日期时间。它应该 return 一行,但现在 return 没有任何结果。

不带日期搜索,用得到的日期重新搜索也是return0个结果,所以肯定不是日期时间不够详细的问题

Criteria crit = dao.getSession().createCriteria(IncidenceEntity.class);
    crit.createAlias("event", "event");
    crit.add(Restrictions.eq("event.id", eventId));
    List<IncidenceEntity> resultList = (List<IncidenceEntity>) crit.list();
    crit = dao.getSession().createCriteria(IncidenceEntity.class);
    crit.createAlias("event", "event");
    crit.add(Restrictions.eq("creationDate", resultList.get(0).getCreationDate()));
    crit.add(Restrictions.eq("event.id", eventId));
    
    IncidenceEntity result = (IncidenceEntity) crit.uniqueResult(); // this is null

在迁移过程中,我们更改了 Connector/J 并将其更新为 5.1 的最新版本,因为我们还不能使用 Connector/J 8.0,因为它需要 Java 8+。我们知道从 MySQL 5.7 迁移到 8.0 意味着日期存在一些问题,但升级检查器没有发现任何问题。

我们的 Hibernate 版本是 3.2.3,Java6 和 Spring3.1.2。

似乎MySQL 8 中的问题是日期列没有毫秒精度(例如 2018-11-01 21:11:34),而我们发送的数据有毫秒,而在 MySQL 5 中,此信息被截断,在 MySQL 8 中,它似乎被四舍五入了。

我们解决了更改日期时间列、添加毫秒的问题。

ALTER TABLE INCIDENCE CHANGE CREATION_DATE CREATION_DATE TIMESTAMP(3);