我正在开发一个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个参数以避免混乱。谢谢。
答案 0 :(得分:1)
您最好从dao中提取查询生成逻辑。您可以将其委托给另一个类,或者只是在该dao中创建一个方法。但是,当事情变得很大时,最好将它委托给另一个班级。
顺便说一句,spring数据jpa为我们完成了查询生成逻辑。它几乎可以满足CRUD的所有需求。你可以看看它。
答案 1 :(得分:1)
(根据相关评论提取)
如果它只是一个foo.country in (:countryList)
,那么Hibernate或Spring Data可以提供帮助。但是,对于您需要使用LIKE
搜索国家/地区列表的情况,您必须手动构建它。您的构造方式(将值直接嵌入到结果查询中)不是优选的,因为它容易出错并使您的代码为SQL注入打开。
进行正确查询构建的方法之一是使用Criteria API。