sql语句:select * from T_AccessControlledPC
在这个表中,有一个类型为datetime的列,但是数据为:0000-00-00 00:00:00
如果使用public List findPageBySql(final String sql,final Page page){
List list=hibernateTemp.executeFind(new HibernateCallback() {
public Object doInHibernate(Session session) throws HibernateException,
SQLException {
    Query query = session.createSQLQuery(sql);
    query.setFirstResult(page.getBeginIndex());
    query.setMaxResults(page.getEndIndex());
return query.list();
}
});
return list;
}方式查询没有问题
但是如果使用public int getCountBySql(String sql) {
int count = 0;
try {
SQLQuery query = super.getHibernateTemplate().getSessionFactory()
.getCurrentSession().createSQLQuery(sql);
count = query.list().size();
} catch (Exception e) {
count = 0;
System.out.println("查询数据失败 = " + sql);
e.printStackTrace();
}
return count;
}就会出现如下异常:
java.sql.SQLException: Cannot convert value '0000-00-00 00:00:00' from column 10 to TIMESTAMP.
,我不明白为什么会这样,是不是hibernate在查询时,会将查询结果帮我转换为Date类型,他一转肯定报错了,可是上面那种又不会出错,这两种到底有什么区别,求个高手指点下,谢谢

解决方案 »

  1.   

    使用Hibernate连接mysql5.1的数据库,表中有一个timestamp类型的字段,报出以下错误:
    java.sql.SQLException: Cannot convert value '0000-00-00 00:00:00' from column 3 to TIMESTAMP
    使用的是5.1的JDBC驱动,参考了官方文档,说'0000-00-00 00:00:00'在java中无法可靠的表示,Connector/J 3.1中就会抛出这个异常,看来5.1的版本中也没有解决这个问题,杯具。
    查了一下表,该字段的默认值确实定义为'0000-00-00 00:00:00',在select这个字段的时候就会报错,没办法,只有去掉了默认值,把该时间字段为空,这样java就不会抛异常了。
    如果时间字段因特殊需要必须为0时,可以使用另一个解决方法,修改JDBC连接参数:
    jdbc:mysql://ip:port/dbname?zeroDateTimeBehavior=convertToNull
    将0转换为null。
      

  2.   

    确实是这种情况,我也是刚在网上看到,不过参数加的不一样,我加的是:zeroDateTimeBehavior=round
    最后没有异常了,可以结贴了!