Tengo que escribir un método donde le paso algunos argumentos y, dependiendo de qué argumentos estén vacíos, modifica la consulta que necesito ejecutar al final.
Por ejemplo, si quiero seleccionar de una tabla Customer que tiene ID , name , surname y address , la consulta inicial sería SELECT * FROM Customer WHERE ID=myId AND name=myName AND surname=mySurname (y ahora verificamos si la dirección que enviado está vacío, si NO lo está, agréguelo a la consulta).
Sé cómo hacer esto en C#, simplemente haciendo una cadena inicial y luego agregándola y usando ExecuteStoreQuery directamente, pero ¿cómo se vería esto en Java? ¿Es Criteria Builder una herramienta viable para esto?
¡Muchas gracias!
Usando CriteriaQuery, es posible hacer algo así (usando Clases Metamodelo JPA Estáticas):
public List<Customer> findCustomer(Long myId, String myName, String mySurName, String myAddress) { CriteriaBuilder cb = enitityManager.getCriteriaBuilder(); CriteriaQuery<Customer> query = cb.createQuery(Customer.class); Root<Customer> root = query.from(Customer.class); List<Predicate> predicates = new ArrayList<>(); predicates.add(cb.equal(root.get(Customer_.ID), myId)); predicates.add(cb.equal(root.get(Customer_.NAME), myName)); predicates.add(cb.equal(root.get(Customer_.SURNAME), mySurName)); if(address != null) { predicates.add(cb.equal(root.get(Customer_.ADDRESS), myAddress)); } query.select(root).where(cb.and(predicates.toArray(new Predicate[0]))); return entityManager.createQuery(query).getResultList(); } En este caso, la dirección solo se comprobará si no es null .
Otro ejemplo sin usar Static JPA Metamodel (no estoy 100% seguro de esto):
public List<Customer> findCustomer(Long myId, String myName, String mySurName, String myAddress) { CriteriaBuilder cb = enitityManager.getCriteriaBuilder(); CriteriaQuery<Customer> query = cb.createQuery(Customer.class); Root<Customer> root = query.from(Customer.class); List<Predicate> predicates = new ArrayList<>(); predicates.add(cb.equal(root.get("ID"), myId)); predicates.add(cb.equal(root.get("name"), myName)); predicates.add(cb.equal(root.get("surename"), mySurName)); if(address != null) { predicates.add(cb.equal(root.get("address"), myAddress)); } query.select(root).where(cb.and(predicates.toArray(new Predicate[0]))); return entityManager.createQuery(query).getResultList(); }