java代码中日期类型字符串转换为oracle日期类型问题

问题具体描述:

在前台页面表单里有一类型列表框和两个日期文本框,要求:可以根据类型查询或者根据时间段查询或者同事根据类型与时间段查询。

封装的属性类:

package com.jxc.util;
public class DetailProperty {
    private String typename;
    public String getTypename() {
        return typename;
    }
    public void setTypename(String typename) {
        this.typename = typename;
    }
    private String beginTime;
    private String endTime;
   
    public String getBeginTime() {
        return beginTime;
    }
    public void setBeginTime(String beginTime) {
        this.beginTime = beginTime;
    }
    public String getEndTime() {
        return endTime;
    }
    public void setEndTime(String endTime) {
        this.endTime = endTime;
    }
   
   

}

dao层

//根据DetailProperty里属性查询进货入库信息
    public List<Buyinfo> getById(DetailProperty property) {
        Session session = HibernateSessionFactory.getSession();
        List<Buyinfo> list=null;
        try {
            String hql="from Buyinfo b where b.goodstype.typename like :typename and "+
            "b.buydate >= :beginTime and b.buydate <= :endTime";
            Query query=session.createQuery(hql);
            query.setProperties(property);
            list = query.list();
            
        } catch (HibernateException e) {
            HibernateSessionFactory.closeSession();
            e.printStackTrace();
        }finally{
            HibernateSessionFactory.closeSession();
        }
        
        return list;
    }

action层

private String tname;
    private String bTime;
    private String eTime;

public String getbTime() {
        return bTime;
    }

    public String geteTime() {
        return eTime;
    }

    public void setbTime(String bTime) {
        this.bTime = bTime;
    }

    public void seteTime(String eTime) {
        this.eTime = eTime;
    }

    public String getTname() {
        return tname;
    }

    public void setTname(String tname) {
        this.tname = tname;
    }

// 根据DetailProperty里属性查询进货入库信息
    public String getById() {
        detailProperty = new DetailProperty();
        if (tname == null || tname.equals("")) {
            detailProperty.setTypename("%");
        } else {
            detailProperty.setTypename("%" +tname+ "%");
        }

        if (bTime == null || bTime.equals("")) {
            detailProperty.setBeginTime("%");
        } else {
            detailProperty.setBeginTime("%" +bTime+ "%");
        }

        if (eTime == null || eTime.equals("")) {
            detailProperty.setEndTime("%");
        } else {
            detailProperty.setEndTime("%" +eTime+ "%");
        }

        Map session = ActionContext.getContext().getSession();
        List list = null;
        try {
            list = this.buyinfoBiz.getById(detailProperty);
            System.out.println(list.size());
        } catch (Exception e) {

            e.printStackTrace();
        }
        session.put("buyinfo", list);
        return "getbyid";
    }

运行时错误提示:

java.lang.String cannot be cast to java.util.Date

不知道dao层的hql语句该怎样转化,应该就是hql语句的错误!

4个回答

为啥public class DetailProperty这个类的时间字段用string呢。。直接用Date不好么

然后在action里把string转成Date 存到数据库里

oyzj642
oyzj642 嗯,我明白你的意思了,只不过我的回复提交的慢了,嘿嘿,iteye,我刚刚注册还不太会用,找了半天才找到自己提交的问题。
7 年多之前 回复
aa1aa3
爱上一条鱼 额 你DAO里这个方法本来就应该是为这个搜索写的啊,后台这个代码本来就是自己写的呀 改改问题不大,而且改了之后也还是和之前一样通用的嚒
7 年多之前 回复
oyzj642
oyzj642 查询怎么能手动该后台呢,有没有其它的办法满足:有没有其它的方法,满足要求:一个表单里有一个商品类型下拉列表框,两个日期文本框, 查询条件分三种情况:1.根据类型查询,两个文本框为空2.根据时间段查询,商品类型为空3.同时根据类型与时间段查询。本来我想运用封装属性的命名查询只写一个hql语句,但出现好多问题。
7 年多之前 回复
aa1aa3
爱上一条鱼 哦晕,好像不能new Date(string)的,要用楼下那个SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(beginTime);如果日期格式是2012-7-3 那就SimpleDateFormat("yyyy-MM-dd").parse(beginTime); 其实可以在DAO里根据参数写hql的,在dao里判断beginTime是否为空,然后写HQL String hql="from Buyinfo b where b.goodstype.typename like :typename; if(beginTimem!=null) { hql + = " and b.buydate >= :begin"; } if(endtime != null) { hql + = " and b.buydate<= :end"; }
7 年多之前 回复
oyzj642
oyzj642 这样写运行提示:java.lang.IllegalArgumentException java.util.Date.parse(Date.java:598) java.util.Date.<init>(Date.java:255) 不知道怎样初始化,还有这个程序还要满足直接按类型查询,即使我不输入时间段也要只按类型查询 出结果,if(前台接收空字符串){也直接new Date(bTime)吗},可运行都提示以上错误
7 年多之前 回复
aa1aa3
爱上一条鱼 如果bTime是null,直接HQL里把b.buydate >= :begin这部分判断去掉
7 年多之前 回复
aa1aa3
爱上一条鱼 如果用的是Date,那就不能setBeginTime("%");了丫,应该直接setBeginTime(new Date(bTime)); 然后hql里,b.buydate >= :begin and b.buydate<= :end;然后把 beginTime endTime 传给begin 和end啊
7 年多之前 回复
oyzj642
oyzj642 我本来用的Date,可要在action里要接收页面传来的值来决定模糊查询的条件,因为%是字符串,就不知道该怎么转化了。这时if (bTime == null || bTime.equals("")) { detailProperty.setBeginTime("%");(此地方出错,这个地方不知道如何转化) } else { detailProperty.setBeginTime("%" +bTime+ "%"); } 还有,我在dao层直接这样转化就可以查询,但条件是固定的, String hql="from Buyinfo b where b.goodstype.typename like :typename and "+ "b.buydate >= to_date('2012-6-1','yyyy-mm-dd') and b.buydate <= to_date('2012-7-2','yyyy-mm-dd'))"; 但换成这样 String hql="from Buyinfo b where b.goodstype.typename like :typename and " + "b.buydate >= :to_date(beginTime,'yyyy-mm-dd') and b.buydate<= :to_date(endTime,'yyyy-mm-dd'))"; 就报错说:unexpected token: ( near line 1, column 96 [from com.jxc.bean.Buyinfo b where b.goodstype.typename like :typename and b.buydate >= :to_date(beginTime,'yyyy-mm-dd') and b.buydate<= :to_date(endTime,'yyyy-mm-dd'))]
7 年多之前 回复

看异常是需要Date类型

改一下get方法

[code="java"]
public Date getBeginTime() {
try{
return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(beginTime);
}catch(Exceptione ex){
return null;
}
}
[/code]

时间的格式自己修改调整

楼主可通过 to_date(dateStr,formart)进行转换

oyzj642
oyzj642 此法行不通,报错: unexpected token: ( near line 1, column 96 [from com.jxc.bean.Buyinfo b where b.goodstype.typename like :typename and b.buydate >= :to_date(beginTime,format) and b.buydate<= :to_date(endTime,format)] 有没有其它的方法,满足要求:一个表单里有一个商品类型下拉列表框,两个日期文本框, 查询条件分三中情况:1.根据类型查询,两个文本框为空2.根据时间段查询,商品类型为空3.同事根据类型与时间段查询。本来我想运用封装属性的命名查询写一个hql语句,但出现好多问题。
7 年多之前 回复

一个很简单的方法
将你 的日期属性的类型改成Date类就可以了

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!