参数查询和关联查询

发表时间:2017-05-17 17:29:23 浏览量( 45 ) 留言数( 0 )

学习目标:

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();
	}
}