2010-03-24 25 views
9

Estoy un poco sorprendido al construir una consulta dinámica utilizando el CriteriaBuilder de JPA 2.0.Consulta dinámica de JPA 2.0 con la API de Criteria

que tienen un buen caso de uso común supongo: El usuario suministra una cantidad arbitraria de parámetros de búsqueda que X sea y/o concatenado: como:

select e from Foo where (name = X1 or name = X2 .. or name = Xn) 

El método o de CriteriaBuilder no es dinámica:

Predicado o (Predicción ... restricciones)

Ideas? Muestras?

Respuesta

7

En su caso, preferiría usar Expression#in(Collection) para evitar tener que bucle y para construir un compuesto Predicate dinámicamente:

CriteriaBuilder cb = em.getCriteriaBuilder(); 

CriteriaQuery<Foo> cq = cb.createQuery(Foo.class); 
Metamodel m = em.getMetamodel(); 
EntityType<Foo> Foo_ = m.entity(Foo.class); 
Root<Foo> foo = cq.from(Foo_); 
cq.where(my.get(Foo_.name).in(params)); 

Es posible que desee comprobar Basic Type-Safe Queries Using the Criteria API and Metamodel API para más detalles.

+0

Hola, Pascal Thivent, Si los params es una sub consulta, ¿cómo puede escribir el código? –

1

en este código Foo_.name dará error de compilación. Como el campo no está declarado en eso. No soy capaz de entender esto. Por favor sugiérame

-raghu

+3

El ejemplo anterior se basa en un metamodelo de las clases administradas de la unidad de persistencia (que se puede generar utilizando un procesador de anotación provisto por la implementación de JPA). Pero por favor, no publique preguntas como respuestas en el hilo existente, abra una nueva pregunta en su lugar. –

Cuestiones relacionadas