学习目标:
1、掌握使用hql的参数查询方式
学习过程:
一、参数查询
1、使用?
在条件查询中我们查询条件都是通过方法的参数设置的,为了提高安全性,我们很少使用字符串拼接的方式,所以在学习jdbc的时候我们使用PreparedStatement,然后使用?进行代参的方式,Query和PreparedStatement有点类似,也是支持这种方式的。同时hql也支持想大于,等于或者in等等条件查询的方式,比如下面我们要根据员工的姓名,体重进行条件查询,示例代码如下:
public class Run3 {
public static void main(String[] args) {
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
// 开启一个事务
session.beginTransaction();
String hql = "select e from Employee e where (e.employeeWeith between ? and ? )and e.employeeName like ?";
Query query = session.createQuery(hql);
query.setParameter(0, 1D);
query.setParameter(1, 30D);
query.setParameter(2, "%liubao%");
List<Employee> employees = query.list();
for (Employee employee : employees) {
System.out.println(employee.getEmployeeName());
}
// 提交事物
session.getTransaction().commit();
session.close();
HibernateUtil.getSessionFactory().close();
}
}
当然大家可以直接使用hiberTemplate的find方法,这里只是为了让大家更加熟悉回调函数才使用这种方式。
2、使用代参,命名参数
Query除了支持使用?代参的方式,还提供了使用命名参数的方式,格式是冒号加命名参数名称
:参数名称
修改上面的例子,使用命名参数的方式
public class Run4 {
public static void main(String[] args) {
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
// 开启一个事务
session.beginTransaction();
String hql = "select e from Employee e where (e.employeeWeith between :mi and :ma )and e.employeeName like :emname";
Query query = session.createQuery(hql);
query.setParameter("mi", 1D);
query.setParameter("ma", 30D);
query.setParameter("emname","%liubao%");
List<Employee> employees = query.list();
for (Employee employee : employees) {
System.out.println(employee.getEmployeeName());
}
// 提交事物
session.getTransaction().commit();
session.close();
HibernateUtil.getSessionFactory().close();
}
}
二、关联查询
在学习sql的时候,我们经常要一次查询多张表,称为多表的关联查询,hql也是一样支持这种多表之间的关联查询,只是操作的对象而已,比如我们现在需要根据职位名称查询员工的信息,使用原始sql语句可能是以下的写法:
select * from employee e, post p where e.post_id=p.post_id where p.post_name like ?
改查hql也是差不多,只是操作的是对象和对象的属性,我们可以这样写:
select e from Employee e,Post p where e.post=p and p.postName like ?
当然hql还可以这样写,
select e from Employee e where e.post.postName like ?
完成代码如下:
public class Run5 {
public static void main(String[] args) {
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
// 开启一个事务
session.beginTransaction();
// String
// hql="select e from Employee e,Post p where e.post=p and p.postName like ?";
String hql = "select e from Employee e where e.post.postName like ?";
Query query = session.createQuery(hql);
query.setParameter(0, "%職位%");
List<Employee> employees = query.list();
for (Employee employee : employees) {
System.out.println(employee.getEmployeeName());
}
// 提交事物
session.getTransaction().commit();
session.close();
HibernateUtil.getSessionFactory().close();
}
}