fluckr 2009-08-20 11:06
浏览 359
已采纳

Hibernate数据库DATETIME类型字段映射为Date类型后的强制转型错误

用Struts2 + Hibernate(3.3.1)做了一个测试程序,查询的时候遇到了强制转换类型错误,数据库是MySQL 5.0,麻烦看下代码,很简单。
异常提示:
[code="java"]
java.lang.ClassCastException: java.lang.String
at org.hibernate.type.DateType.toString(DateType.java:101)
at org.hibernate.type.NullableType.nullSafeToString(NullableType.java:117)
at org.hibernate.type.NullableType.nullSafeSet(NullableType.java:158)
at org.hibernate.type.NullableType.nullSafeSet(NullableType.java:136)
at org.hibernate.param.NamedParameterSpecification.bind(NamedParameterSpecification.java:61)
at org.hibernate.loader.hql.QueryLoader.bindParameterValues(QueryLoader.java:514)
at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1589)
at org.hibernate.loader.Loader.doQuery(Loader.java:696)
…………
[/code]

Hibernate 映射文件:
[code="xml"]






<!-- MySQL数据库中TIME字段的类型为DATETIME -->



[/code]

DAO类
[code="java"]
package dao;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import model.SData;

import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;

public class SDao {

private Session session = null;

private Transaction tx = null;

Map<String, String> map = null;

@SuppressWarnings("unchecked")
public List<SData> query( SData data ) {
    session = HibernateUtil.getCurrentSession();
    try {
        String hql = createSQL(data);
        Query query = HibernateUtil.getCurrentSession().createQuery(hql);

        Iterator<String> it = map.keySet().iterator();
        while (it.hasNext()) {
            String key = it.next();
            query.setParameter(key, map.get(key));
        }

        query.setMaxResults(512);
        List list = query.list();
        return list;
    }
    catch (HibernateException e) {
        HibernateUtil.rollbackTransaction();
    }

    return null;
}

private String createSQL( SData data ) {
    StringBuffer hql = new StringBuffer();
    hql.append("from SData as s where 1=1 ");

    map = new HashMap<String, String>();

    String value = data.getName();
    if (value != null && value.length() > 0) {
        map.put("name", "%" + value + "%");
        hql.append("and s.name like :name ");
    }

    value = data.getAddr();
    if (value != null && value.length() > 0) {
        map.put("addr", value);
        hql.append("and s.addr = :addr ");
    }

    Date time = data.getTime();
    if (time != null) {
        long now = time.getTime();
        now = now - now % 86400000 + 57600000;

        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
        map.put("begin", sdf.format(new Date(now)));
        map.put("end", sdf.format(new Date(now + 86400000)));
        hql.append("and s.time between :begin and :end ");
    }

    value = data.getLine();
    if (value != null && value.length() > 0) {
        map.put("line", value);
        hql.append("and s.line = :line ");
    }

    return hql.toString();
}

}
[/code]

个人感觉应该不是大问题,不过我找了很久还是没想出来解决办法,实属无奈来此发帖劳烦大家,求帮忙,感激不尽。

  • 写回答

1条回答 默认 最新

  • wanghaolovezlq 2009-08-20 11:19
    关注
        Date time = data.getTime();   
        if (time != null) {   
            long now = time.getTime();   
            now = now - now % 86400000 + 57600000;   
    
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");   
            map.put("begin", sdf.format(new Date(now)));   
            map.put("end", sdf.format(new Date(now + 86400000)));   
            hql.append("and s.time between :begin and :end ");   
        }  
    

    这个地方就搞错了,你怎么把date转换成字符串保存成参数

    while (it.hasNext()) {

    String key = it.next();

    //这个地方对给date类型的参数设置参数不能为字符串的,否则自然就出现上面的类型转换错误
    query.[color=red]setParameter/color);

    }

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥50 potsgresql15备份问题
  • ¥15 Mac系统vs code使用phpstudy如何配置debug来调试php
  • ¥15 目前主流的音乐软件,像网易云音乐,QQ音乐他们的前端和后台部分是用的什么技术实现的?求解!
  • ¥60 pb数据库修改与连接
  • ¥15 spss统计中二分类变量和有序变量的相关性分析可以用kendall相关分析吗?
  • ¥15 拟通过pc下指令到安卓系统,如果追求响应速度,尽可能无延迟,是不是用安卓模拟器会优于实体的安卓手机?如果是,可以快多少毫秒?
  • ¥20 神经网络Sequential name=sequential, built=False
  • ¥16 Qphython 用xlrd读取excel报错
  • ¥15 单片机学习顺序问题!!
  • ¥15 ikuai客户端多拨vpn,重启总是有个别重拨不上