HQL:为多个参数添加冒号分隔的字符串以进行搜索

时间:2016-05-03 08:31:37

标签: java spring hibernate hql

我正在开发一个Spring-MVC项目,我正在使用Hibernate作为ORM工具。该项目的一个特点是它可以通过提供国家,城市等各种参数来搜索其他用户。现在,我想通过多个国家进行搜索。出于这个原因,我向该方法发送了:个国家/地区的分隔名称。

由于最初该方法仅适用于单个国家/地区,因此我修改了查询以按此顺序工作。这是传递多个参数的正确方法,因为查询很复杂。谢谢。

@Override
public List<Student> addHostSearchHistory(HostSearchHistory hostSearchHistory, Long hostId) {

    String queryString = giveMeFormattedHostSearchString("AND",hostSearchHistory);

    Query query = session.createQuery(queryString);

    if (!(hostSearchHistory.getCity() == null)) {
        if (!(hostSearchHistory.getCity().equals(""))) {
            query.setParameter("city", "%"+hostSearchHistory.getCity().toUpperCase()+"%");
        }
    }
    List<Student> studentList = query.list();

    Query query1 = session.createQuery(giveMeFormattedHostSearchString("OR",hostSearchHistory));
    if (!(hostSearchHistory.getCity() == null)) {
        if (!(hostSearchHistory.getCity().equals(""))) {
            query1.setParameter("city", "%"+hostSearchHistory.getCity().toUpperCase()+"%");
        }
    }

}

private String giveMeFormattedHostSearchString(String clause, HostSearchHistory hostSearchHistory){
    StringBuilder sb = new StringBuilder();
    sb.append("from Student as s where ");

    if (!(hostSearchHistory.getCountry() == null)) {
        if (!(hostSearchHistory.getCountry().isEmpty())) {
            String[] countries = hostSearchHistory.getCountry().split(":");
            sb.append("(");
            for(String s : countries){
                sb.append(" ").append("upper(s.studentCountry) like ").append(s);
            }
            sb.append(")");


        }
    }
    if (!(hostSearchHistory.getCity() == null)) {
        if (!(hostSearchHistory.getCity().isEmpty())) {
            sb.append(" ").append(clause).append(" ").append("upper(s.city) like :city");
        }
    }
}

搜索多个国家/地区是否有更好的错误方法..请注意,我只包含3个参数以避免混乱。谢谢。

2 个答案:

答案 0 :(得分:1)

您最好从dao中提取查询生成逻辑。您可以将其委托给另一个类,或者只是在该dao中创建一个方法。但是,当事情变得很大时,最好将它委托给另一个班级。

顺便说一句,spring数据jpa为我们完成了查询生成逻辑。它几乎可以满足CRUD的所有需求。你可以看看它。

答案 1 :(得分:1)

(根据相关评论提取)

如果它只是一个foo.country in (:countryList),那么Hibernate或Spring Data可以提供帮助。但是,对于您需要使用LIKE搜索国家/地区列表的情况,您必须手动构建它。您的构造方式(将值直接嵌入到结果查询中)不是优选的,因为它容易出错并使您的代码为SQL注入打开。

进行正确查询构建的方法之一是使用Criteria API。