如何在hibernate中编写搜索查询

时间:2012-01-31 13:15:42

标签: java hibernate search

我试图在hibernate中编写搜索查询。我从开放式会议源代码中获得了帮助。 所以我的查询:

public User getAllUser(String search) {
    String[] searchItems = search.split(" ");
    try {
        String sqlQuery = "SELECT * FROM  USER u " + "WHERE u.deleted = 1 ";
        sqlQuery += "AND ( ";
        for (int i = 0; i < searchItems.length; i++) {
            if (i != 0) {
                sqlQuery += " OR ";
            }
            sqlQuery += "( " + "lower(u.last_name) LIKE '"
                    + StringUtils.lowerCase("%" + searchItems[i] + "%")
                    + "' " + "OR lower(u.first_name) LIKE '"
                    + StringUtils.lowerCase("%" + searchItems[i] + "%")
                    + "' " + "OR lower(u.username) LIKE '"
                    + StringUtils.lowerCase("%" + searchItems[i] + "%")
                    + "' " + ") ";
        }
        sqlQuery += " )";

        log.debug("sqlQuery : " + sqlQuery);
        Query query = sessionFactory.getCurrentSession().createQuery(
                sqlQuery);

        return (User) query.list().get(0);

    } catch (HibernateException e) {
        e.printStackTrace();
    }
    return null;
}

它说有一个意想不到的令牌,但我没有找到它的位置。

所以我有两个问题:

  1. 如何使其发挥作用。
  2. 如何使用hibernate中的Criteria and Projection / Restrictions
  3. 编写搜索查询

3 个答案:

答案 0 :(得分:3)

您可以使用:

    Query query = sessionFactory.getCurrentSession().createQuery("" +
            "select * from OdontogramaDiagnosticoModel where odontologia = :idOdontologia");
    query.setParameter("idOdontologia", "102");
    return query.list();

这里展示了两件事你应该注意:

另一个例子:

sessionFactory.getCurrentSession().createCriteria(OdontologiaDiagnostico.class)
    .add(Restrictions.eq("diagnosticosClinicos", "test"));

答案 1 :(得分:1)

这不是一个休眠查询。这是一个原生的SQl。您应该使用createSQLQuery,如下所示

Query query = sessionFactory.getCurrentSession().createSqlQuery(
                sqlQuery);

请参阅this以选择使用休眠。

另外,我建议您使用Criterias

答案 2 :(得分:0)

这看起来非常复杂和不整洁。您是否考虑过使用Hibernate Search?它旨在使这样的查询变得简单。