Você precisa usar:
preparedStatement.executeQuery();
ao invés de
preparedStatement.executeQuery(login);
quando você passa uma string para
executeQuery()
que consulta é executada literalmente e, portanto, o ?
é enviado para o banco de dados que cria o erro. Ao passar a string de consulta, você não está executando a instrução preparada "em cache" para a qual você passou os valores.