Boa noite galera, procurei esse assunto no fórum mas não encontrei.
Estou desenvolvendo um site que consulta informações de veículos que passaram em um pedágio. Eu já tenho o acesso ao banco de dados e também já consigo efetuar a busca de um veículo por vez. Mas gostaria de digitar várias placas ao mesmo tempo(usando por exemplo um textArea) , as placas podem ser separadas por espaço ou vírgula, e quando clicar em buscar, trazer os dados de todos os veículos listados.
Alguém sabe o que posso estar utilizando para fazer esse tipo de busca?
Desde já obrigado
Você pode usar select com in, colocando as placas como parâmetros, separados por vírgula. Algo como:
select * from veiculos where placa in ('ABC1111', 'DEF3333', 'BDB8888')
O in pode ter um desempenho ruim se houverem muitos registros (milhares ou milhões) para pesquisar e o banco não estiver bem otimizado, então fique atento a isso e, se necessário, crie índices ou dê uma olhada em alternativas, como o exists no MySQL.
Confira a sintaxe da sua consulta e das tabelas, pois o IN deve retornar tudo o que casa com os elementos informados. Veja se não estão sobrando espaços e quebras de linha quando você processa o conteúdo do textarea.
//---------LISTAR PLACAS------------//*/
public List getLista(String placas) {
try {
List pass = new ArrayList();
PreparedStatement stmt = this.connection.prepareStatement("SELECT * FROM "
“CONSULTAPLACA_TAP WHERE DATA BETWEEN ‘30/10/2021’ and ‘30/11/2021’ and PLACA IN(’”+placas+’")");
public class PassagemDaoTest { @Test
//@Ignore
public void buscar() throws ClassNotFoundException, SQLException {
PassagemDao2 passDao = new PassagemDao2();
List passagens1 = passDao.getLista("'BEW6F48,‘ISM1032’");
for(Passagem pass : passagens1) {
System.out.println(pass);
Como garantes que quem preenche o formulario preenche direitinho com as '?
Deves pedir, no frontend, as placas separadas por virgulas e transformar em lista de Strings. Essa lista de Strings deve ser o parametro deste método e depois aqui percorres a lista e constrois o IN corretamente.
Como tens agora este teste não passa porque, deveria ser
List passagens1 = passDao.getLista("'BEW6F48','ISM1032'");
Oh galera, deu certo aqui. No IN eu estava colocando aspas duplas e aspas simples desse jeito IN("’+filter.getPlacs()+’"). Só buscava quando inseria apenas uma placa.
Agora está buscando corretamente, só preciso colocar as placas entre aspas simples, conforme explicado por vocês
“WHERE DATAOCORRENCIA BETWEEN ‘01/11/2021’ and ‘21/11/2021’ and PLACAOPERADOR IN(”+filter.getPlacs()+")