迁移到MySQL 8后,Hibernate Criteria查询不适用于datetime列

问题描述

在将数据库从MySQL 5.7迁移到8.0后,我们注意到,包括datetime列的查询无法正常工作,尤其是在比较相等的情况下。

在迁移之前可以运行的代码如下:

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时使用它,因此我们搜索特定的相同日期时间。它应该返回一行,但是现在不返回任何结果。

不带日期搜索并带获取的日期重新搜索也会返回0个结果,因此绝对不是日期时间不够详细的问题

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意味着日期方面存在一些问题,但是Upgrade Checker并没有发现任何问题。

我们的Hibernate版本是3.2.3,Java 6和Spring 3.1.2。

解决方法

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

我们解决了更改datetime列,增加毫秒的问题。

ALTER TABLE INCIDENCE CHANGE CREATION_DATE CREATION_DATE TIMESTAMP(3);

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...