2010-03-13 5 views
12

Je suis nouveau à JPA.JPA where clause

En JPA, la requête est:

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

Comment définir la catégorie à une catégorie JPA? Donc, si la catégorie null est passée, j'ignore simplement le paramètre category, sélectionne tous les produits.

Répondre

0

SELECT * FROM produit Où CATEGORY = *

Je pense que vous êtes nouveau à SQL, aussi.

WHERE CATEGORY = * ne veut pas dire "aucune catégorie" (ce n'est même pas SQL valide).

À la fois SQL et JPA, vous n'auriez tout simplement pas la clause WHERE si vous voulez une catégorie (ou en SQL, vous pouvez avoir WHERE CATEGORY IS NOT NULL).

+0

Désolé pour la mauvaise requête SQL :) Votre solution "WHERE CATEGORY IS NOT NULL" est bonne, mais je dois créer une autre requête. Existe-t-il un autre moyen de sauvegarder une requête? –

15

Comment puis-je définir une catégorie dans n'importe quelle catégorie dans JPA? Donc, si la catégorie null est passée, j'ignore simplement le paramètre category, sélectionne tous les produits.

Vous devrez créer la requête dynamiquement ici. Avec HQL (ce qui est un exemple simplifié de):

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() 

Mais, en fait, ma recommandation serait d'utiliser l'API Critères ici:

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

Beaucoup plus simple pour les requêtes dynamiques complexes.

+0

Les critères sont une meilleure solution pour les requêtes dynamiques. Expression.eq est obsolète, à la place vous pouvez utiliser Restrictions.eq – Gere

4

Pour les paramètres d'archivage deviennent en option, vous pouvez écrire une requête sans avoir à utiliser l'API Critères:

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

Bonjour, je me demande s'il est possible de faire ce genre d'évaluation avec des collections comme la requête de ce post http: // stackoverflow.com/questions/570229/hibernate-hql-query-comment-définir-une-collection-comme-un-nommé-paramètre-de-une-requête. Donc, cette requête ne fonctionne pas dans mon projet comme suit: FROM Foo O WH ID =: id AND (: barlist est null ou Barre dans (: barlist)) –

1

Comment définir la catégorie à une catégorie JPA? Donc, si la catégorie nulle passé, j'ignore simplement le paramètre de catégorie, sélectionnez tous les produits.

Vous pouvez définir la catégorie sur "%". if (category == null) query.setParameter ("category", "%"); else query.setParameter ("catégorie", catégorie);

1

Vous avez raison presque avec un petit changement.

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

dans setParamater "valeur" (texte exact) doit correspondre à ": valeur" dans la requête.