Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

386
Views
Generador de criterios JPA para consultas dinámicas

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!

over 4 years ago · Santiago Trujillo
1 answers
Answer question

0

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(); }
over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!