LoginSignup
ajmpt
@ajmpt

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

java.sql.Date へのキャスト

解決したいこと

ここに解決したい内容を記載してください。

DB登録時にutil.Date からjava.sql.Date へのキャストを行うときに
java.sql.Date へのキャストが上手くいかないです。

発生している問題・エラー

出ているエラーメッセージを入力
java.lang.ClassCastException: java.util.Date cannot be cast to java.sql.Date
    test.TestDao.add(TestDao.java:17)
    test.TestServlet.doGet(TestServlet.java:84)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:634)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    filter.AllFilter.doFilter(AllFilter.java:44)

または、問題・エラーが起きている画像をここにドラッグアンドドロップ

### 該当するソースコード
```//TestServlet
package test;

import java.io.IOException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class TestServlet
 */
@WebServlet("/TestServlet")
public class TestServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    /**
     * @see HttpServlet#HttpServlet()
     */
    public TestServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        //response.getWriter().append("Served at: ").append(request.getContextPath());
        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");


        try {

            TestDao hd = new TestDao();
            String actDate = "2021-06-15T16:13";
            String y = actDate.substring(0, 4);
            String mo = actDate.substring(5, 7);
            String d = actDate.substring(8, 10);
            String h = actDate.substring(11, 13);
            String mi = actDate.substring(14, 16);

            int year = Integer.parseInt(y);
            int month = Integer.parseInt(mo) - 1;
            int day = Integer.parseInt(d);
            int hour = Integer.parseInt(h);
            int minute = Integer.parseInt(mi);
            int ss = 0;

            final DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            Calendar cal = Calendar.getInstance();
            cal.set(year, month, day, hour, minute, ss);
            String date = df.format(cal.getTime());

            System.out.println("date : " + date);

            Date registDate = df.parse(date);

            System.out.println("registDate : " + registDate);
            int result = hd.add(1,1,registDate);
            System.out.println(result);
            request.setAttribute("result", result);


        } catch (Exception e) {
            e.printStackTrace();
        }
        getServletContext().getRequestDispatcher("http://localhost:8080/uhd_pet/test1.jsp").forward(request, response);
    }


}


package test;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

import etc.AbstractDao;

public class TestDao extends AbstractDao{
    public int add(int p_id, int s_id, java.util.Date registDate) {
        int result = -1;
        String sql = "insert into history (pet_id,service_id,service_date) values(?,?,?)";

        try (Connection conn = getConnection();
                PreparedStatement pstmt = conn.prepareStatement(sql)) {

      //コンソールではここでエラーになりました
            java.sql.Date sqlDate = (java.sql.Date)registDate;

            pstmt.setInt(1, p_id);
            pstmt.setInt(2, s_id);
            pstmt.setDate(3,sqlDate);
            result = pstmt.executeUpdate();

        } catch (SQLException | ClassNotFoundException e) {
            e.printStackTrace();
        }

        return result;
    }
}


### 自分で試したこと
ここに問題・エラーに対して試したことを記載してください。
色々キャストに関して調べてみたのですが解決できませんでした。

どなたかわかる方宜しくお願いします。
0

1Answer

コンパイラを通してないですが、

java.sql.Date sqlDate = new java.sql.Date(registDate.getTime());

で、行けるのではないかと。

ただしミリ秒の扱いがよろしくないようで、
ちゃんとやるには、以下サイトが参考になると思います。

0

Your answer might help someone💌