1、简单概述
1.1、
1) SQL:面向的是数据库 select * from tableName;
2) HQL查询(Hibernate Query language): hibernate 提供的面向对象的查询语言。
例:Session.createQuery(“from tableName”) //和第1)点的SQL语句恒等的,查询出来的效果是一样的
3) Criteria 查询,完全面向对象的查询(Query By Criteria ,QBC)
4) SQLQuery, 本地SQL查询,逻辑比较复杂,HQL很难实现
缺点:不能跨数据库平台,如果改了数据库,sql语句有可能要改
使用场景: 对于复杂sql,hql实现不了的情况,可以使用本地sql查询
HQL查询要注意:
1、使用hql查询的时候 auto-import="true" 要设置true,如果是false,写hql的时候,要指定类的全名,例如:
1.1、 Query q = session.createQuery("from Employee"); //auto-import="true"的时候
1.2、Query q = session.createQuery("from com.shore.model.Employee"); //auto-import="false"的时候
2、用注解版时,auto-import="true" (默认为true),写不写类的全名,都是可以的。用xml 配置版时,需要指定 auto-import="true" ,这样省代码,不指定为true,则像上面第1点的第1.2小点那样写。
1.2、查询全部列
1 Query query = session.createQuery("from Employee"); //OK 2 Query query = session.createQuery("from com.shore.model.Employee"); //OK 3 Query query = session.createQuery("select * from Employee"); //错误,不支持 * 4 Query query = session.createQuery("select e from Employee e"); // OK 5 System.out.println(query.list()); //把结果打印到控台上
1.3、查询指定的列
1 Query query = session.createQuery("select name,sex,salary from Employee"); 2 System.out.println(query.list());
1.4、查询指定的列,自动封装为对象
1 Query query = session.createQuery("select new com.shore.model.SubEmployee(name,sex,salary) from Employee"); 2 System.out.println(query.list());
1.5、条件查询
1.5.1、条件查询之占位符(?)
1 Query query = session.createQuery("select new com.shore.model.SubEmployee(name,sex,salary) from Employee where department_id = ?"); 2 //query.setParameter(0, 1);//或者下面的setInteger(0, 1)方法也行 3 query.setInteger(0, 1); 4 System.out.println(query.list());
1.5.2、条件查询之命名参数(:)
1 Query query = session.createQuery("select new com.shore.model.SubEmployee(name,sex,salary) from Employee where department_id = :deptID"); 2 query.setParameter("deptID", 1); 3 System.out.println(query.list());
1.5.3、条件查询之范围查询(between .... and ... )
1 Query query = session.createQuery("select new com.shore.model.SubEmployee(name,sex,salary) from Employee where department_id between :d1 and :d2"); 2 query.setParameter("d1", 1); //也可以用占位符?实现 3 query.setParameter("d2", 2); 4 System.out.println(query.list());
1.5.4、条件查询之模糊查询 like
1 Query query = session.createQuery("select new com.shore.model.SubEmployee(name,sex,salary) from Employee where name like ?"); 2 query.setParameter(0, "%三%"); 3 System.out.println(query.list());
1.6、聚合函数统计
1 Query query = session.createQuery("select count(*) from Employee where name like ?"); 2 query.setParameter(0, "%三%"); 3 System.out.println(query.list());
1.7、分组查询(group by)
1 Query query = session.createQuery("select department,count(*) from Employee group by department_id"); //根据部门外键 2 System.out.println(query.list());
1.8、连接查询 (内连接、外连接、左/右连接等)
内连接:Join == inner join //交集
左连接:Left join,以左边的表为主表,如果没有join上,左边表数据完整,右边表的数据可能为空 。//左边表的所有数据+右边表的交集部分
右连接:Right join,以右边的表为主表,如果没有join上,右边表数据完整,左边表的数据可能为空。//右边表的所有数据+左边表的交集部分
外连接:Outer join //并集
1 1) 内连接 【映射已经配置好了关系,关联的时候,直接写对象的属性即可】 2 Query q = session.createQuery("from Employee e inner join e.department"); //department是Employee实体中映射的一个外键(Employee表中的department_id) 3 4 2) 左外连接 5 Query q = session.createQuery("from Employee e left join e.department"); 6 7 3) 右外连接 8 Query q = session.createQuery("from Department d right join d.employee"); //映射的一个外键(employee_id) 9 10 4) 迫切内连接 【使用fetch, 会把右表的数据,填充到左表对象中!】 11 Query q = session.createQuery("from Employee e inner join fetch e.department"); 12 q.list(); 13 14 5) 迫切左外连接 15 Query q = session.createQuery("from Employee e left join fetch e.department");
1.9、HQL查询优化
1 Query query = session.getNamedQuery("getAllDept"); //定义一个参数名 getAllDept 2 query.setParameter(0, 10);
然后在对应的xml 配置文件中 写SQL语句。(对于发杂的SQL语句,可以这样做,方便项目发布后,还可以修改)
1 比如在:Employee.hbm.xml 在xml中存放sql语句 2 <query name="getAllDept"> //这里的参数名 getAllDept 要和上面的对应 3 <![CDATA[ 4 from Employee d where department_id < ?; //这里写SQL语句,不是HQL语句 5 ]]> 6 </query>
2、HQL查询语言 实例
原创作者:DSHORE 作者主页:http://www.cnblogs.com/dshore123/ 原文出自:https://www.cnblogs.com/dshore123/p/11546575.html 欢迎转载,转载务必说明出处。(如果本文对您有帮助,可以点击一下右下角的 推荐,或评论,谢谢!) |
原文地址:https://www.cnblogs.com/dshore123/p/11588358.html