我有以下方法:
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();
}
我想将标题,副标题和作者包含在搜索参数中,但仅限于它们不为空时。我怎样才能做到这一点?例如,如果字幕和作者为空,我只想按作者搜索。
答案 0 :(得分:0)
使用a Criteria query,它精确地设计用于以动态方式构建查询:
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:你的SQL查询没有意义。 group by
应该与聚合函数一起使用。
编辑:因为您实际上想要聚合具有相同作者,标题和副标题的行,所以您无法返回List<Book>
,并且必须在查询中添加投影:
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();