@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;
}
Como fazer um OR em vez de um AND com JPA ?
5 Respostas
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’ );
Segue um exemplo:
@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
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?
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.