0

我有以下方法:

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

我想将标题、副标题和作者作为搜索参数,但前提是它们不为空。我怎样才能做到这一点?例如,如果 subtitle 和 author 为空,我只想按作者搜索。

4

1 回答 1

0

使用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应该与聚合函数一起使用。

编辑:由于您实际上想要将具有相同作者、标题和副标题的行聚合在一起,因此您不能返回 a 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();
于 2013-08-14T07:08:31.113 回答