【问题标题】:Hibernate - ERROR: Data truncation: Incorrect datetime value休眠 - 错误:数据截断:日期时间值不正确
【发布时间】:2015-01-18 08:13:47
【问题描述】:

我正在使用此代码将数据从一个表插入到另一个表中,

Session session = HibernateUtil.getSessionFactory().openSession();
session.createSQLQuery(
                "INSERT INTO news_statistics (crime_type, crime_district, crime_date, crime_year, crime_yearquarter, crime_count) " +
                        "(SELECT crime_type,(SELECT district FROM location_district_mapper ldm WHERE ceg.location = ldm.location) , crime_date, YEAR (crime_date), CONCAT(YEAR (crime_date), ' - ', QUARTER(crime_date)), count(id) " +
                        "FROM crime_entity_group ceg " +
                        "WHERE crime_date >= '2012-01-01' AND crime_date <= '2014-12-31' " +
                        "GROUP BY crime_type, district, crime_date " +
                        "ORDER BY YEAR ('crime_date'))").executeUpdate();

这会引发错误,

ERROR: Data truncation: Incorrect datetime value: 'crime_date'
Exception in thread "main" org.hibernate.exception.DataException: could not execute statement
    at org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:69)
    at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:49)
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:126)
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:112)
    at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:211)
    at org.hibernate.engine.query.spi.NativeSQLQueryPlan.performExecuteUpdate(NativeSQLQueryPlan.java:211)
    at org.hibernate.internal.SessionImpl.executeNativeUpdate(SessionImpl.java:1310)
    at org.hibernate.internal.SQLQueryImpl.executeUpdate(SQLQueryImpl.java:389)
    at com.cse10.analyzer.StatGenerator.generateStats(StatGenerator.java:22)
    at com.cse10.analyzer.Analyzer.main(Analyzer.java:13)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)
Caused by: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Incorrect datetime value: 'crime_date'
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3556)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3490)
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1959)
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2109)
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2643)
    at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2077)
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2362)
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2280)
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2265)
    at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:208)
    ... 10 more

但是当我直接使用 phpmyadmin 运行查询时,查询运行良好,没有显示任何错误....!

当我只运行查询的select 部分并使用list() 列出结果时,它不会出错。因此,我可以假设问题出在查询的 insert 部分。当我从查询中删除 crime_date 时,查询运行时不会显示任何错误。

两个表中crime_date的类型都是date,并在两个休眠xml文件中定义如下。

<property name="crimeDate" type="date">
        <column name="crime_date" not-null="false"/>
</property>

架构是,

CREATE TABLE IF NOT EXISTS `crime_entity_group` (
  `id` int(11) NOT NULL,
  `crime_article_id` int(11) DEFAULT NULL,
  `crime_type` varchar(50) DEFAULT NULL,
  `crime_date` date DEFAULT NULL,
  `location` varchar(50) DEFAULT NULL,
  `district` varchar(20) DEFAULT NULL,
  `police` varchar(50) DEFAULT NULL,
  `court` varchar(50) DEFAULT NULL,
  `criminal` varchar(200) DEFAULT NULL,
  `victim` varchar(50) DEFAULT NULL,
  `victim_count` int(11) DEFAULT NULL,
  `possession` varchar(50) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE IF NOT EXISTS `news_statistics` (
  `id` int(11) NOT NULL,
  `crime_type` varchar(50) DEFAULT NULL,
  `crime_district` varchar(20) DEFAULT NULL,
  `crime_date` date DEFAULT NULL,
  `crime_year` varchar(10) DEFAULT NULL,
  `crime_yearquarter` varchar(20) DEFAULT NULL,
  `crime_count` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

有人知道解决办法吗?

提前谢谢你...

【问题讨论】:

  • 尝试删除您的第一个(外部)select 周围的(..) 。他们没用
  • 我建议一点一点地简化 SQL,直到找到问题所在。首先,你能用 just 一个选择而不是插入来重现这个吗?
  • @JonSkeet。问题在于插入crime_date
  • 你能显示news_statisticscrime_entity_group的ddl吗
  • @Jens 我添加了ddls..

标签: java mysql sql database hibernate


【解决方案1】:

您需要确保news_statistics.crime_datecrime_entity_group.crime_date 是相同的 SQL 类型(例如 DATE、TIME、TIMESTAMP、DATETIME)。

如果一个是 DATE,另一个是 DATETIME,您的语句将因为违反类型不匹配约束而失败。

来自您的异常消息:

不正确的日期时间值:'crime_date'

news_statistics.crime_date 似乎是 DATETIME 列,而 crime_entity_group.crime_date 可能是 DATE。

【讨论】:

  • 但为什么会显示“日期时间值不正确”?很奇怪。
  • 很抱歉...问题出在ORDER BY YEAR ('crime_date'))。应该改为ORDER BY YEAR (crime_date))。我的错误..
  • 现在说得通了。 YEAR 不需要 VARCHAR。无论如何,这是个好问题。
【解决方案2】:

这个表达式

CONCAT(YEAR (crime_date), ' - ', QUARTER(crime_date))

将被评估为类似“2015 - 1”的值,这对于 DATE 或 DATETIME 类型的列不是有效值。 MySQL 的有效值类似于 'yyyy-mm-dd',并且还删除了“-”(破折号)符号周围的空格。

【讨论】:

  • 谢谢。但是与此相关的列定义为varchar。问题在于crime_date
【解决方案3】:

问题在于ORDER BY YEAR ('crime_date'))。我的错误.. 'crime_date' 是一个字符串,而不是日期。这就是引发错误的原因。应该改为ORDER BY YEAR (crime_date))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-25
    • 2013-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-23
    相关资源
    最近更新 更多