Como fazer um OR em vez de um AND com JPA ?

5 respostas
jpa
vpmaciel1981
@Override
	public Collection<Banco> consultarRegistro(Banco banco) {

		EntityManager entityManager = JPA.getEntityManagerFactory().createEntityManager();
		EntityTransaction tx = entityManager.getTransaction();
		tx.begin();

		CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
		CriteriaQuery<Banco> criteriaQuery = criteriaBuilder.createQuery(Banco.class);
		Root<Banco> rootBanco = criteriaQuery.from(Banco.class);

		List<Predicate> predicates = new ArrayList<Predicate>();

		if (banco.getNome() != null && banco.getNome().length() > 0) {
			predicates.add(criteriaBuilder.equal(rootBanco.get("nome"),banco.getNome()));
		}
		if (banco.getCodigo() != null && banco.getCodigo().length() > 0) {
			predicates.add(criteriaBuilder.equal(rootBanco.get("codigo"),banco.getCodigo()));
		}

		criteriaQuery.select(rootBanco).where(predicates.toArray(new Predicate[] {}));

		List<Banco> list = entityManager.createQuery(criteriaQuery).getResultList();
		tx.commit();
		entityManager.close();
		return list;
	}

5 Respostas

vpmaciel1981

Por exemplo.

Ele está fazendo um select * from Banco where ( codigo = 1 and nome = ‘BRASIL’ );

Quero que faça um select * from Banco where ( codigo = 1 or nome = ‘BRASIL’ );

Jonathan_Medeiros

Segue um exemplo:

vpmaciel1981
@Override
	public Collection<Banco> consultarRegistro(Banco banco) {

		EntityManager entityManager = JPA.getEntityManagerFactory().createEntityManager();
		EntityTransaction tx = entityManager.getTransaction();
		tx.begin();

		CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
		CriteriaQuery<Banco> criteriaQuery = criteriaBuilder.createQuery(Banco.class);
		Root<Banco> rootBanco = criteriaQuery.from(Banco.class);

		List<Predicate> predicates = new ArrayList<Predicate>();

		Predicate predicateNome = criteriaBuilder.equal(rootBanco.get("nome"), banco.getNome());
		Predicate predicateCodigo = criteriaBuilder.equal(rootBanco.get("codigo"), banco.getCodigo());

		predicates.add(criteriaBuilder.or(predicateNome, predicateCodigo));

		criteriaQuery.select(rootBanco).where(predicates.toArray(new Predicate[] {}));

		List<Banco> list = entityManager.createQuery(criteriaQuery).getResultList();
		tx.commit();
		entityManager.close();
		return list;
	}
// Troquei mas ainda não funcionou
javaflex

Pq essa complicação toda? Via SQL o código pra atender essa consulta ficaria bem mais simples e legível. E é a primeira vez que vejo uso de transação pra fazer uma consulta, pra que isso?

vpmaciel1981

Na hora da pesquisa na tela de pesquisa o usuário clicaria no botão pesquisar e os campos vazios não seriam pesquisados a pesquisa seria com o select * from banco where codigo = 1 and banco = ‘brasil’.
Na hora do cadastro precisava verificar primeiro se o objeto já tinha sido cadastrado com o mesmo nome ou código, a pesquisa seria com o select * from banco where codigo = 1 ou banco = ‘brasil’
Na hora do cadastro seria para informar ao usuário que já tinha um banco com o nome ou código já cadastrados.
Consegui resolver de outra forma primeiro verificando se o banco com o nome já havia sido cadastrado, depois o código. Informando assim o usuário.

Criado 5 de abril de 2019
Ultima resposta 6 de abr. de 2019
Respostas 5
Participantes 3