如何解决迁移到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);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。