按条件查询的sql语句即使用where关键字,比如按名字查询Person的sql语句为select * from new_table where name="hibernate";
同样,使用HQL语句也可以实现按条件查询。
Query query = sessionFactory.getCurrentSession().createQuery("from Person where name='ch'");
如果要把name作为方法的参数传入进来,就需要给HQL语句增加一个可变动的填充,也就是要参数化HQL语句,可以改一下,把'ch'改为?,并使用Query的setParameter方法把?占位符替换掉再查询。
Query query = sessionFactory.getCurrentSession().createQuery("from Person where name=?“);
query.setParameter(0, name);
List personList = query.list();
如此就查询出根据name条件的列表personList。这个结果列表可以是多个,因为名字为ch的Person可能很多personList.size() >0,我们只需从personList中取出第一个personList.get(0);并且要强制转为Person的对象result。
if(personList.size() >0) {
Person result = (Person)personList.get(0);
return result;
}
在PersonDaoSessionImple.java中可以实现整个按name条件查询的方法getPersonByName(String name):
@Override public Person getPersonByName(String name) { Query query = sessionFactory.getCurrentSession().createQuery("from Person where name=?"); query.setParameter(0, name); List personList = query.list(); if(personList.size() >0) { Person result = (Person)personList.get(0); return result; } return null; }
在PersonService.java和PersonServiceImpl.java中已经有了findPersonByName这个方法的PersonDao调用,PersonController.java的login方法也有了按照name查询的实现。
@RequestMapping(value = "/login", method = RequestMethod.POST) public Object login(HttpServletRequest request, HttpServletResponse response, PersonForm personForm) { try { Person person = personService.findPersonByName(personForm.getName()); if(person.getPassword().equals(personForm.getPassword())) { request.getSession().setAttribute("person", person); } } catch (Exception e) { e.printStackTrace(); } return "default"; }访问http://localhost:8080/springMvcMavenProject/loginForm.jsp,输入用户名和密码,比如 cheering和123,可以查询到名字cheering对应的记录,显示在网页上。
提示:如果查询不到一条记录,这里会出现一个NullPointerExcception即空指针异常,这个异常也是常见的,因为记录是空的,改进方法为加入判断空值的语句。
Person person = personService.findPersonByName(personForm.getName());
if(person!= null) {
if(person.getPassword().equals(personForm.getPassword())) {
request.getSession().setAttribute("person", person);
}
}