2013-08-14 4 views
0

J'ai la méthode suivante:Hibernate requête paramétrées

public List<Book> searchGroups(String title, String subtitle, String author) { 
    Session session = HibernateUtil.getCurrentSession(); 
    Query query = session.createSQLQuery("SELECT * FROM book GROUP BY title, subtitle, author;").addEntity(Book.class); 
    return query.list(); 
} 

Je voudrais inclure le titre, sous-titre et auteur en tant que paramètres de recherche, mais seulement quand ils ne sont pas nuls. Comment puis je faire ça? Par exemple, si le sous-titre et l'auteur sont null, je voudrais seulement chercher par auteur.

Répondre

0

Utilisez a Criteria query, qui est précisément conçu pour construire des requêtes de manière dynamique:

Criteria c = session.createCriteria(Book.class, "book"); 
if (title != null) { 
    c.add(Restrictions.eq("book.title", title); 
} 
if (subtitle != null) { 
    c.add(Restrictions.eq("book.subtitle", subtitle); 
} 
if (author != null) { 
    c.add(Restrictions.eq("book.author", author); 
} 
List<Book> books = c.list(); 

PS: votre requête SQL n'a pas de sens. group by est censé être utilisé avec des fonctions d'agrégation.

EDIT: puisque vous voulez en fait de regrouper les lignes qui ont le même auteur, le titre et le sous-titre ensemble, vous ne pouvez pas retourner un List<Book>, et devez ajouter des projections à votre requête:

c.setProjection(Projections.distinct(
    Projections.projectionList() 
     .add(Projections.property("book.title")) 
     .add(Projections.property("book.subtitle")) 
     .add(Projections.property("book.author")))); 
List<Object[]> result = c.list(); 
+0

Je sais critères mais je n'ai besoin que de résultats distincts. Par exemple j'ai trois livres: deux ont le même titre, sous-titre, auteur et le troisième a le même titre et sous-titre mais un auteur différent. J'ai besoin que les deux premiers livres n'apparaissent que comme une seule entrée. –

+0

Ensuite, vous ne pouvez pas retourner une 'Liste ', car un livre a un ID qui le rend différent de tous les autres livres. Ajoutez une projection distincte et trois projections de propriété à votre requête. EDIT à venir. –