Erro em subsconsulta usando PreparedStatement

Bom dia galera,

Estou desenvolvendo uma consulta a uma base de dados, minha Query quando executada no Banco de Dados funciona perfeitamente ou até mesmo na aplicação quando não uso o PreparedStatement para setar os valores, contudo quando uso ele, a consulta não retorna todos os valores.

Alguém sabe me explicar o pq disto está ocorrendo?

Query:

select * from sala as s
where not exists
(select * from horario as h
where periodo_letivo = ‘2020.1’ and s.cod_sala = h.cod_sala and nome_dia = ‘SEGUNDA’ and turno = ‘VESPERTINO’)

Na aplicação:

private String sqlLocalizSalaPorTurnoDia = "select * from sala as s
where not exists (select * from horario as h where periodo_letivo = '2020.1' and s.cod_sala = h.cod_sala and nome_dia = ? and turno = ?)";

public List<SalaDTO> listarSalaPorTunoDia(String nomeDia, String turno, String codUsuario) 
{
        List<SalaDTO> salas = new ArrayList<>();
        
try {
            pstm = conexaoDAO.conectar().prepareStatement(sqlLocalizSalaPorTurnoDia);
            pstm.setString(1, nomeDia);
            pstm.setString(2, turno);

            rs = pstm.executeQuery();
            SalaDTO salaDTO;
            while (rs.next()) {
                salaDTO = new SalaDTO();
                salaDTO.setCodSala(rs.getString("cod_sala"));
                salaDTO.setNomeSala(rs.getString("nome_sala"));
                salaDTO.setCapacidade(rs.getString("capacidade"));
                salaDTO.setTamanho(rs.getString("tamanho"));
                salaDTO.setLocalizacao(rs.getString("localizacao"));
                salaDTO.setTipoSala(rs.getString("tipo_sala"));
                salaDTO.setModulo(rs.getString("modulo"));
                salas.add(salaDTO);
            }
        
        } catch (Exception e) {
            e.printStackTrace();
        }
        return salas;
    }

Alguém?

Coloca a query que é gerado no console, quando é executado a consulta

Então pode retornar algum resultado, já que a negação de todos não são é: algum é :man_student:.

salaDTO é uma referência.
Semelhante ao ponteiro, quando ele aponta para new SalaDTO, a referência muda para o último objeto consultado.

Como usa a mesma referência para todos os resultados, no final vai referenciar apenas o último objeto.

O correto seria:

while (rs.next()) { 
    SalaDTO salaDTO = new SalaDTO();// dentro do loop gerando uma nova referência.
    // restante do código