2010-03-13 34 views
12

Soy nuevo en JPA.JPA where cláusula any

En JPA, la consulta es:

Query query = entityManager.createQuery("select o from Product o WHERE o.category = :value"); 
query.setParameter("category", category); 

¿Cómo puedo programar una categoría a cualquier categoría en APP? Entonces, si la categoría nula pasó, simplemente ignoro el parámetro categoría, selecciono todos los productos.

Respuesta

0

SELECT * FROM producto donde CATEGORÍA * =

Creo que es nuevo en SQL, también.

WHERE CATEGORY = * no significa "ninguna categoría" (ni siquiera es SQL válido).

Tanto en SQL como en JPA, simplemente no tendría la cláusula WHERE si desea alguna categoría (o en SQL podría tener WHERE CATEGORY IS NOT NULL).

+0

perdón por la consulta SQL incorrecta :) Su solución "DONDE LA CATEGORÍA NO ES NULA" es buena, pero tengo que crear otra consulta. ¿Hay alguna otra forma de guardar una consulta? –

15

¿Cómo puedo establecer la categoría para cualquier categoría en JPA? Entonces, si la categoría nula pasó, simplemente ignoro el parámetro categoría, selecciono todos los productos.

Tendrá que crear la consulta dinámicamente aquí. Con HQL (este es un ejemplo simplificado):

Map<String, Object> params = new HashMap<String, Object>(); 
StringBuffer hql = new StringBuffer("from Product p"); 
boolean first = true; 

if (category != null) { 
    hql.append(first ? " where " : " and "); 
    hql.append("p.category = :category"); 
    params.put("category", category); 
} 

// And so on... 

Query query = session.createQuery(hql.toString()); 

Iterator<String> iter = params.keySet().iterator(); 
while (iter.hasNext()) { 
    String name = iter.next(); 
    Object value = params.get(name); 
    query.setParameter(name, value); 
} 

List results = query.list() 

Pero, en realidad, mi recomendación sería utilizar la API de criterios aquí:

Criteria criteria = session.createCriteria(Product.class); 
if (category != null) { 
    criteria.add(Expression.eq("category", category); 
} 
// And so on... 
List results = criteria.list(); 

mucho más simple para consultas dinámicas complicadas.

+0

Criteria es una mejor solución para consultas dinámicas. Expression.eq está en desuso, en su lugar puede usar Restrictions.eq – Gere

4

Para parámetros de fichero se convierten opcional se puede escribir una consulta sin tener que utilizar la API Criterios:

select o from Product o WHERE :value is null or :value='' or o.category = :value 
+0

Hola, me pregunto si es posible hacer este tipo de evaluación con colecciones como la consulta de esta publicación http: // stackoverflow.com/questions/570229/hibernate-hql-query-how-to-set-a-collection-as-a-named-parameter-of-a-query. Por lo tanto, esta consulta no funciona en mi proyecto de la siguiente manera: DESDE Foo DONDE Id =: id AND (: barlist es nulo o Bar in (: barlist)) –

1

¿Cómo puedo programar una categoría a cualquier categoría en APP? Entonces, si se pasa la categoría nula , simplemente ignoro el parámetro categoría, selecciono todos los productos.

Puede establecer la categoría en "%". if (categoría == nulo) query.setParameter ("categoría", "%"); else query.setParameter ("categoría", categoría);

1

Tienes razón casi con pequeños cambios.

Query query = entityManager.createQuery("select o from Product o WHERE o.category = :value"); 
query.setParameter("value", category); 

en setParamater "valor" (texto exacto) debe coincidir con ": valor" en la consulta.