Pesquisa Simples

8 respostas Resolvido
java
Besteti

// Fala galera, estou com problema nesse código, ele não está respeitando o a regra de pesquisa por id. Poderiam me ajudar, desde já agradeço.

package br.com.wdbo.syshelpdesk.banco;

import br.com.wdbo.syshelpdesk.modelo.Empresa;
import java.util.List;
import javax.persistence.Query;

public class EmpresaDAO extends DAO<Empresa>{

public EmpresaDAO() {
    super(Empresa.class);
}

public List<Empresa> findByFiltro(Long id, String empresa) {

    List<Empresa> listaEmpresa = null;

    String sql = ("from Empresa e where "
            + "( :Id is not null and  e.id = :Id ) "
            + " or (:Empresa is not null and  e.empresa like :Empresa)");

    this.em = JPAUtil.getEntityManager();

    em.getTransaction().begin();
    Query query = em.createQuery(sql);

    query.setParameter("Id", id);

    query.setParameter("Empresa", empresa + "%");

            
    listaEmpresa = query.getResultList();
    em.getTransaction().commit();
    em.close();

    return listaEmpresa;
}

8 Respostas

Lucas_Camara

Deixe sua classe assim e veja se funciona:

package br.com.wdbo.syshelpdesk.banco;

import br.com.wdbo.syshelpdesk.modelo.Empresa;
import java.util.List;
import javax.persistence.Query;

public class EmpresaDAO extends DAO<Empresa> {
	public EmpresaDAO() {
		super(Empresa.class);
	}
	
	public List<Empresa> findByFiltro(Long id, String empresa) {
		StringBuilder hql = new StringBuilder();
		hql.append("FROM Empresa e ");
		hql.append("WHERE e.id = :id OR e.empresa LIKE :empresa");
		
		this.em = JPAUtil.getEntityManager();
		
		Query query = em.createQuery(sql);
		query.setParameter("id", id);
		query.setParameter("empresa", empresa + "%");
		
		List<Empresa> listaEmpresa = query.getResultList();
		em.close();
		return listaEmpresa;
	}
}
Besteti

package br.com.wdbo.syshelpdesk.banco;

import br.com.wdbo.syshelpdesk.modelo.Empresa;

import java.util.List;

import javax.persistence.Query;
public class EmpresaDAO extends DAO {

public EmpresaDAO() {

super(Empresa.class);

}
public List<Empresa> findByFiltro(Long id, String empresa) {
	StringBuilder hql = new StringBuilder();
	hql.append("FROM Empresa e ");
	hql.append("WHERE e.id = :id OR e.empresa LIKE :empresa");
	
	this.em = JPAUtil.getEntityManager();
	
	Query query = em.createQuery(sql); // Mas Fica dando erro nesta linha, pois estamos chamando 'sql' que não existe.
	query.setParameter("id", id);
	query.setParameter("empresa", empresa + "%");
	
	List<Empresa> listaEmpresa = query.getResultList();
	em.close();
	return listaEmpresa;
}

}

Lucas_Camara

kkk foi mal, eh que alterei no notepad++. Mude essa linha para:

Query query = em.createQuery(hql.toString());
Besteti

Amigo não funcionou :cry: … Tirei um print da minha front-end.

Ele continua não respeitando quando pesquiso só pelo o código. O mesmo esta trazendo as empresas cadastradas no banco.

Atenciosamente.

Lucas_Camara
Solucao aceita

Assim deve ir:

package br.com.wdbo.syshelpdesk.banco;

import br.com.wdbo.syshelpdesk.modelo.Empresa;
import java.util.List;
import javax.persistence.Query;

public class EmpresaDAO extends DAO<Empresa> {
	public EmpresaDAO() {
		super(Empresa.class);
	}
	
	public List<Empresa> findByFiltro(Long id, String empresa) {
		StringBuilder hql = new StringBuilder();
		hql.append("FROM Empresa e ");
		hql.append("WHERE 1 = 1 ");
		
		if(id != null) {
			hql.append("AND e.id = :id ");
		}
		
		if(empresa != null && !"".equals(empresa)) {
			hql.append("AND e.empresa LIKE :empresa ");
		}
		
		this.em = JPAUtil.getEntityManager();
		Query query = em.createQuery(sql);
		
		if(id != null) {
			query.setParameter("id", id);
		}
		
		if(empresa != null && !"".equals(empresa)) {
			query.setParameter("empresa", empresa + "%");
		}
		
		List<Empresa> listaEmpresa = query.getResultList();
		em.close();
		return listaEmpresa;
	}
}
M

Erro na sua sql, pois a consulta irá trazer o registro onde seu id for igual ao parâmetro e também onde a descrição for igual ao parâmetro passado.

No caso da sua print. Você esta buscando empresas que tenha o código 1 e as empresas onde a descrição começa com “%”. Ou seja irá trazes todas as empresas.

Uma solução seria criar duas funções distintas findById(Integer id) e findLikeDescricao(String descricao). E uma função que conteria uma definida lógica de negócio. Exemplo se id diferente de nulo pesquisa por id senão por descrição.

Besteti

Amigo Muito Obrigado pela ajuda. Está de Parabéns !!! :grinning:

L

Uma outra forma, seria

String sql = ("select e from Empresa e where e.id = :Id UNION select em from Empresa em where em.empresa like :Empresa ")

Como você está utilizando a mesma entidade, o hibernate suporta o UNION

Não esqueça de

query.setParameter("Empresa", "'" + empresa + "%'");

Criado 14 de julho de 2016
Ultima resposta 16 de jul. de 2016
Respostas 8
Participantes 4