[RESOLVIDO]Pesquisar no banco de dados mysql através da data

Olá, sou novo aqui e peço desculpas se estou fazendo algo errado.
Procurei em tudo quanto foi lugar, mas não encontrei a resposta. Já vi tópicos parecidos aqui mas não resolveu minha questão.
Estou tentando fazer uma simples agenda, em que, já consigo gravar no banco de dados e fazer a leitura também, porém necessito fazer uma pesquisa através da data. Agradeço desde já a ajuda!

Classe DAO

 public List<Agenda> readData(Date dataescolhida) {

    Connection con = ConnectionFactory.getConnection();
    PreparedStatement stmt = null;
    ResultSet rs = null;

    List<Agenda> horarios = new ArrayList<>();

    try {
        stmt = con.prepareStatement("SELECT paciente FROM agenda WHERE date_format(dataescolhida,'%d/%m/%Y') LIKE '?'");
        stmt.setDate(1, (java.sql.Date) dataescolhida); //aqui está o erro
        rs = stmt.executeQuery();

        while (rs.next()) {

            Agenda agenda = new Agenda();

            agenda.setPaciente(rs.getString("paciente"));

            horarios.add(agenda);
        }

    } catch (SQLException ex) {
        Logger.getLogger(AgendaDAO.class.getName()).log(Level.SEVERE, null, ex);
    } finally {
        ConnectionFactory.closeConnection(con, stmt, rs);
    }

Onde faço a pesquisa

java.sql.Date data;

public void readAgenda() {

    DefaultTableModel modelo = (DefaultTableModel) tbTeste.getModel();
    modelo.setNumRows(0);      
    
    try {

        String strData = lbData2.getText();
        SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy");
        data = new java.sql.Date(format.parse(strData).getTime());
        
        
        AgendaDAO dao = new AgendaDAO();

        for (Agenda a : dao.readData(data)) {

            modelo.addRow(new Object[]{
                a.getPaciente()

            });
        }
    } catch (Exception e) {
        JOptionPane.showMessageDialog(null, "erro");
    }
}

Erro:

set 23, 2018 6:54:55 PM model.dao.AgendaDAO readData
GRAVE: null
java.sql.SQLException: Parameter index out of range (1 > number of parameters, which is 0).
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1074)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:988)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:974)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:919)
at com.mysql.jdbc.PreparedStatement.checkBounds(PreparedStatement.java:3813)
at com.mysql.jdbc.PreparedStatement.setInternal(PreparedStatement.java:3795)
at com.mysql.jdbc.PreparedStatement.setInternal(PreparedStatement.java:3840)
at com.mysql.jdbc.PreparedStatement.setDate(PreparedStatement.java:3715)
at com.mysql.jdbc.PreparedStatement.setDate(PreparedStatement.java:3684)
at model.dao.AgendaDAO.readData(AgendaDAO.java:138)
at Telas.TelaAgenda.readAgenda(TelaAgenda.java:2307)
at Telas.TelaAgenda.(TelaAgenda.java:49)
at Telas.TelaAgenda$40.run(TelaAgenda.java:2384)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:756)
at java.awt.EventQueue.access$500(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:709)
at java.awt.EventQueue$3.run(EventQueue.java:703)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:726)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

Você não pode fazer cast de um objeto java.uitl.Date para um java.sql.Date.
Você precisa fazer isso:

stmt.setDate(1, new java.sql.Date(dataescolhida.getTime()));

Entendeu?
Ah, nomes de variáveis, quando compostos, devem seguir o padrão camelCase…

Caro Darlan, obrigado pela resposta, mas o erro ainda persiste

E quanto ao nome da variável, foi um equivoco, obrigado pela lembrança

Cara, o erro acima se deve ao fato de você usar o ? de forma errada.
Quando você usa PreparedStatement, você não deve usar aspas simples.

1 curtida

Cara, verdade, copiei e colei do workbench. O erro sumiu, porém não consegui carregar na jTable ainda. Ela aparece vazia ainda. Tens alguma idéia de algum outro erro? Tô quebrando a cabeça.

Debuga e verifica se está trazendo a data.
Aliás, nunca vi selects com LIKE para datas.
Outra coisa, a coluna é de que tipo? DATE ou varchar?

Sim está trazendo a data
Usei o LIKE, porque estou tentando de tudo, não sei se está certo realmente, mas sou iniciante (acho que não comentei antes)
Peço desculpas se estou cometendo erros primários
A coluna é tipo DATE

Olha, sugiro dar uma boa lida nisso.
Pois bem, LIKE (parecido, semelhante, etc) é usado quando você pretende trazer resultados não específicos, mas, aproximados. Em geral, usa-se o coringa (%) para dizer que se busca algo (normalmente parte de uma string ou varchar) que contenha aquela expressão. Logo, para data (tipo DATE) não é muito útil.
No caso, sugiro que você substitua por = ou mesmo por BETWEEN (aí você precisa definir o intervalo no qual está buscando uma data:

String sql = "SELECT paciente FROM agenda WHERE data_escolhida BETWEEN ? AND ?";
stmt = con.prepareStatement(sql);
stmt.setDate(1, new java.sql.Date(dataIni.getTime());
stmt.setDate(2, new java.sql.Date(dataFim.getTime());
stmt.executeQuery();

Entendeu?

Refiz tudo do zero e deu certo finalmente
Em algum lugar tinha algo mais errado, só não sei aonde…rsrs, mas enfim funcionou
Obrigado pelas dicas e pelo seu tempo Darlan, foram muito uteis!