Devi usare:
preparedStatement.executeQuery();
invece di
preparedStatement.executeQuery(login);
quando passi una stringa a executeQuery() quello la query viene eseguita letteralmente e quindi il ? viene inviato al database che quindi crea l'errore. Passando la stringa di query non stai eseguendo l'istruzione preparata "in cache" per la quale hai passato i valori.