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.