Hibernate参数化查询

时间:2013-08-14 07:00:04

标签: hibernate hql

我有以下方法:

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

我想将标题,副标题和作者包含在搜索参数中,但仅限于它们不为空时。我怎样才能做到这一点?例如,如果字幕和作者为空,我只想按作者搜索。

1 个答案:

答案 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();