ClassCastException:java.util.Date无法强制转换为java.sql.Date

时间:2014-02-05 10:57:18

标签: java sql

您好我的代码正在抛出ClassCastException。 StackTrace显示:

java.lang.ClassCastException: java.util.Date cannot be cast to java.sql.Date
    at com.affiliate.DAO.AffiliateDAO.insertAffiliate(AffiliateDAO.java:48)

即DAO中的 ps.setDate(6,(Date)affiliate.getDate());

以下是我的servlet:

   protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    Affiliate af= new Affiliate();

    af.setFisrtName(request.getParameter("txtFname"));
    af.setLastName(request.getParameter("txtLname"));
    af.setGender(request.getParameter("txtGender"));
    af.setCategory(request.getParameter("txtCategory"));
    String dob=(request.getParameter("txtDob"));
    SimpleDateFormat formatter = new SimpleDateFormat("MM/dd/yyyy");  
    Date date;
    try {
        date = (Date)formatter.parse(dob);
        af.setDate(date);
    } catch (ParseException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    af.setAge(Integer.parseInt(request.getParameter("txtAge")));
    af.setAddress(request.getParameter("txtAddr"));
    af.setCountry("India");
    af.setState(request.getParameter("txtState"));
    af.setCity(request.getParameter("txtCity"));
    af.setPinCode(Integer.parseInt(request.getParameter("txtPin")));
    af.setEmailId(request.getParameter("txtEmail"));
    af.setStd(Integer.parseInt(request.getParameter("txtStd")));
    af.setContactNo(Integer.parseInt(request.getParameter("txtPhone")));
    af.setMobileNo(Long.parseLong(request.getParameter("txtMobile"),10));

AffiliateService afs=new AffiliateService();
**afs.createAffiliate(af);**
}

以下是我的DAO:

public void insertAffiliate(Affiliate affiliate){
    String sql="INSERT INTO REGISTER " +"(id,FisrtName,LastName,Gender,Category,DateOfBirth,Age,Address,Country,State,City,PinCode,EmailId,Std,ContactNo,MobileNo)VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
    Connection conn = null;

    try {
        **conn = dataSource.createConnection();**
        PreparedStatement ps = conn.prepareStatement(sql);
        ps.setInt(1, affiliate.getId());
        ps.setString(2, affiliate.getFisrtName());
        ps.setString(3, affiliate.getLastName());
        ps.setString(4,affiliate.getGender());
        ps.setString(5, affiliate.getCategory());
        ***ps.setDate(6, (Date) affiliate.getDate());***
        ps.setInt(7, affiliate.getAge());
        ps.setString(8, affiliate.getAddress());
        ps.setString(9,affiliate.getCountry());
        ps.setString(10,affiliate.getState());
        ps.setString(11, affiliate.getCity());
        ps.setInt(12, affiliate.getPinCode());
        ps.setString(13, affiliate.getEmailId());
        ps.setInt(14,affiliate.getStd());
        ps.setInt(15, affiliate.getContactNo());
        ps.setLong(16, affiliate.getMobileNo());

        ps.executeUpdate();
        ps.close();

    } catch (SQLException e) {
        throw new RuntimeException(e);

    } finally {
        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException e) {}
        }
    }
}

以下是我的DTO:

public class Affiliate {

@NotNull
    @Past
    Date date;

public Date getDate() {
        return date;
    }
    public void setDate(Date date) {
        this.date = date;
    }

请在这方面帮助我

4 个答案:

答案 0 :(得分:10)

正如docs所说,Date的{​​{1}}中的setDate()参数采用PreparedStatement类型的Date对象。但是您似乎在java.sql.Date类中使用了java.util.Date对象。

这就是你得到Affiliate

的原因

要解决此问题,您需要将ClassCastException: java.util.Date cannot be cast to java.sql.Date课程中Date课程的类型更改为Affiliate或执行此操作

java.sql.Date

答案 1 :(得分:4)

java.sql.Datejava.util.Date的子类,而不是相反。

  • java.sql.Date可以投放到java.util.Date
  • java.util.Date 无法投放到java.sql.Date

但是,大多数位于JDBC之上的API(如Spring或Hibernate)都接受java.util.Date。几乎普遍,除非你真的需要java.sql.Date,否则最好导入java.util.Date

如果直接使用JDBC,那么例如java.sql.PreparedStatement方法只接受java.sql.Date,所以你必须自己构建它。

java.sql.ResultSet方法也返回java.sql.Date,但它们可以直接用作java.util.Date而无需进一步操作。

答案 2 :(得分:1)

您无法将实用日期插入sql日期

java.util.Date utilDate = affiliate.getDate();
java.sql.Date sqlDate = new java.sql.Date(utilDate.getTime());

现在,您可以将sqlDate作为

插入
ps.setDate(6, sqlDate);

答案 3 :(得分:0)

在您的servlet中使用import java.sql.Date而不是import java.util.Date