Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

391
Vistas
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 Respuestas
Responde la pregunta

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 Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda