ClassCastException: java.util.Date 不能转换为 java.sql.Date
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/21575253/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
ClassCastException: java.util.Date cannot be cast to java.sql.Date
提问by user3222718
Hello my code is throwing ClassCastException
.
The StackTrace is showing :
你好我的代码正在抛出ClassCastException
。StackTrace 显示:
java.lang.ClassCastException: java.util.Date cannot be cast to java.sql.Date
at com.affiliate.DAO.AffiliateDAO.insertAffiliate(AffiliateDAO.java:48)
ie @ ps.setDate(6, (Date) affiliate.getDate());in DAO
即@ ps.setDate(6, (Date)affiliate.getDate()); 在 DAO
Below is my servlet:
下面是我的 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);**
}
Below is my DAO:
下面是我的 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) {}
}
}
}
Below is my DTO:
以下是我的 DTO:
public class Affiliate {
@NotNull
@Past
Date date;
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
Please help me in this regard
请在这方面帮助我
采纳答案by SudoRahul
As the docssay, the Date
parameter in the setDate()
of PreparedStatement
takes a Date object of the type java.sql.Date
. But you seemed to have used java.util.Date
object in your Affiliate
class.
正如文档所说,of 中的Date
参数采用类型为 Date 的对象。但是您似乎在您的班级中使用了对象。setDate()
PreparedStatement
java.sql.Date
java.util.Date
Affiliate
And that is why you get the ClassCastException: java.util.Date cannot be cast to java.sql.Date
.
这就是为什么你得到ClassCastException: java.util.Date cannot be cast to java.sql.Date
.
To fix this, you need to either change the type of Date
object in your Affiliate
class to java.sql.Date
or do this
要解决此问题,您需要将类中的Date
对象类型更改Affiliate
为java.sql.Date
或执行此操作
ps.setDate(6, new java.sql.Date(affiliate.getDate().getTime()));
回答by Ghanshyam
Use import java.sql.Date
instead of import java.util.Date
in your servlet.
在您的 servlet 中使用import java.sql.Date
而不是import java.util.Date
。
回答by Lingasamy Sakthivel
You can't insert util date into sql date
您不能将 util 日期插入 sql 日期
java.util.Date utilDate = affiliate.getDate();
java.sql.Date sqlDate = new java.sql.Date(utilDate.getTime());
Now, you can insert sqlDate
as
现在,您可以插入sqlDate
为
ps.setDate(6, sqlDate);
回答by Stewart
java.sql.Date
is a subclass of java.util.Date
, not the other way around.
java.sql.Date
是 的子类java.util.Date
,而不是相反。
java.sql.Date
can be cast tojava.util.Date
.java.util.Date
cannotbe cast tojava.sql.Date
.
java.sql.Date
可以投射到java.util.Date
.java.util.Date
不能强制转换为java.sql.Date
.
However, most APIs which sit onto top of JDBC, such as Spring or Hibernate, accept java.util.Date
. So almost universally, unless you really need a java.sql.Date
, it is better to import java.util.Date
.
但是,大多数位于 JDBC 之上的 API,例如 Spring 或 Hibernate,都接受java.util.Date
. 所以几乎普遍,除非你真的需要一个java.sql.Date
,否则最好导入java.util.Date
.
If using JDBC directly, then for example java.sql.PreparedStatement
methods only accept java.sql.Date
, so you will have to construct that yourself.
如果直接使用 JDBC,那么例如java.sql.PreparedStatement
方法只接受java.sql.Date
,因此您必须自己构造它。
java.sql.ResultSet
methods also return java.sql.Date
, but they can be directly used as a java.util.Date
without further manipulation.
java.sql.ResultSet
方法也 return java.sql.Date
,但它们可以直接用作 ,java.util.Date
而无需进一步操作。