ResultSet rst= prest.executeQuery(sql);
Это неверно. Должно быть executeQuery ().
SQL передается для выполнения при использовании Statement. Вместо этого он передается в PreparedStatement при использовании переменных привязки. Поскольку вы используете API-интерфейс Statement, JDBC выполняет его, не подставляя в переменные привязки, и интересуясь, что делать с буквальными вопросительными знаками.