SQL与HQL的区别
1、sql 面向数据库表查询。hql 面向对象查询。
2、sql: from 后面跟的是表名, where 后用表中字段做条件查询。hql:from 后面跟的类名,where后用对象的属性做条件。
两者间最根本的区别是,HQL是面向对象的。
1、sql 面向数据库表查询。hql 面向对象查询。
2、sql: from 后面跟的是表名, where 后用表中字段做条件查询。hql:from 后面跟的类名,where后用对象的属性做条件。
两者间最根本的区别是,HQL是面向对象的。
SQL语句的关联查询
1、用逗号,默认为内关联,查询出来的数据是两个表都同时存在的数据(交集),效率高
2、left 或right join ,以左或右为参照物。比如左连接,左表有的数据 右表没有,那么查询出来的数据以左表的数据为准,右表没有的用null来占位。
3、join ...... on on后面是两个表关联的条件。
HQL的关联查询
1、在Hibernate对象之间我们已经做好映射关系,要查任何一个对象的数据,都可以在对象中“点”出来
2、HQL进行关联查询的时候,对象与对象之间一定要预先配置了映射关系。因此HQL在使用关联查询时,没有on。
1、用逗号,默认为内关联,查询出来的数据是两个表都同时存在的数据(交集),效率高
2、left 或right join ,以左或右为参照物。比如左连接,左表有的数据 右表没有,那么查询出来的数据以左表的数据为准,右表没有的用null来占位。
3、join ...... on on后面是两个表关联的条件。
HQL的关联查询
1、在Hibernate对象之间我们已经做好映射关系,要查任何一个对象的数据,都可以在对象中“点”出来
2、HQL进行关联查询的时候,对象与对象之间一定要预先配置了映射关系。因此HQL在使用关联查询时,没有on。
下面我们就来看看hql的基本操作:
1、查询出一个对象
1、查询出一个对象
1 /** 2 * 查询一个对象 3 */ 4 @Test 5 public void hqlTest9(){ 6 String hql="from MTeacherEntity where teacherName=?"; 7 MTeacherEntity t= (MTeacherEntity) session.createQuery(hql) 8 .setParameter(0,"李老师") 9 .uniqueResult(); //查询一个对象,若返回多个,会报错 10 System.out.println(t.getTeacherId()+" "+t.getTeacherName()); 11 }
2、查询出多个对象,可以使用Object数组接收,也可以使用Map接收,还可以自定义DTO类进行接收。
1 /** 2 * 返回多个对象 3 */ 4 @Test 5 public void hqlTest4(){ 6 String hql="select teacherId,teacherName from MTeacherEntity where teacherName like ?"; 7 List<Object[]> list=session.createQuery(hql) 8 .setParameter(0,"%李%").list(); 9 for (Object obj[]: 10 list) { 11 System.out.println(obj[0].toString()+" "+obj[1].toString()); 12 } 13 } 14 @Test 15 public void hqlTest5(){ 16 String hql="select new com.project.entity.many.TeacherDTO(teacherId,teacherName) from MTeacherEntity where teacherName like ?"; 17 List<TeacherDTO> list=session.createQuery(hql) 18 .setParameter(0,"%老师%").list(); 19 for (TeacherDTO teacher: 20 list) { 21 System.out.println(teacher.getTeacherId()+" "+teacher.getTeacherName()); 22 } 23 } 24 @Test 25 public void hqlTest6(){ 26 String hql="select new Map(teacherId,teacherName) from MTeacherEntity where teacherName like ?"; 27 List<Map> list=session.createQuery(hql) 28 .setParameter(0,"%老师%").list(); 29 for (Map teacher: 30 list) { 31 System.out.println(teacher.get("0")+" "+teacher.get("1")); 32 } 33 }
3、分页查询
1 /** 2 * 分页查询 3 */ 4 @Test 5 public void hqlTest8(){ 6 int pageNO=2; 7 int pageSize=5; 8 String hql="from MTeacherEntity"; 9 List<MTeacherEntity> list=session.createQuery(hql) 10 .setFirstResult((pageNO-1)*pageSize) //起始下标 11 .setMaxResults(pageSize) //返回多少条数据 12 .list(); 13 for (MTeacherEntity t: 14 list) { 15 System.out.println(t.getTeacherName()); 16 } 17 }
4、关联查询
1 /** 2 * 关联查询 3 */ 4 @Test 5 public void hqlTest7(){ 6 String hql="select new Map(t.teacherId,t.teacherName,s.studentName)" + 7 " from MTeacherEntity t left join t.studentSet s " + 8 " where t.teacherName like ?"; 9 List<Map> list=session.createQuery(hql) 10 .setParameter(0,"%老师%").list(); 11 for (Map teacher: 12 list) { 13 System.out.println(teacher.get("0")+" "+teacher.get("1")+"学生:"+teacher.get("2")); 14 } 15 }
5、修改
1 /** 2 * 修改 3 */ 4 @Test 5 public void hqlTest10(){ 6 String hql="update MTeacherEntity set teacherName=? where teacherId=?"; 7 int i=session.createQuery(hql) 8 .setParameter(0,"陈老师") 9 .setParameter(1,"402881d670f68cf60170f68cfa600000") 10 .executeUpdate(); 11 System.out.println(i);//打印修改、删除影响的条数 12 }
6、删除
1 /** 2 * 删除 3 */ 4 @Test 5 public void hqlTest11(){ 6 String hql="delete from MTeacherEntity where teacherName=?"; 7 int i=session.createQuery(hql) 8 .setParameter(0,"陈老师") 9 .executeUpdate(); 10 System.out.println(i); 11 }
hql没有提供insert的添加语句,他是直接使用save进行插入数据的。所以hql只提供了删除、修改、查询语句。