hibernate(十)HQL查询及Criteria条件查询
2017-08-17 11:23
471 查看
Hibernate查询接口Query、Criteria
Query
此接口执行的语言是HQL,HQL语言是hibernate自己定义的,是面向类查询的,它的语法是sql的语法,它操作的是类,是面向对象的语言。这个语言看上去很像sql,但不要被语法结构上的相似锁迷惑,HQL是非常有意识的被设计为完全面向对象的查询特点:面向类的查询语言及面向对象的查询语言,模仿SQL语法,支持大部分SQL查询使用规则。这样的语言使得开发人员写查询非常少,从而提高效率,养成面向对象的思想。
以学生班级作为例子验证HQL语言的一些特点:
对大小写敏感,但类名除外
书写测试查询的方法调用dao层的查询
查询结果发送了两条sql语句
更改查询将类名之外的改为大写运行后结果一致,但当把类名改为小写后报如下错误
支持关联和连接查询
更改查询时传入的语句为
可以查出相同的内容。连接查询fetch获得抓取的意思必须写只发一条语句,是HQL语言的优化。3张表不关联发4条语句关联的话也不是只发一条。
支持where子句查询上面已经验证。
支持聚集函数查询在聚合查询时支持select
在调用查询方法时注意,查询出来的结果是几条,根据条数选择调用单条还是全查的方法。
以查询数据库中的学生表有几条记录。
运行结果如下:
支持表达式查询
以in为例
数据库中的内容如下:
查询结果与数据库中内容一致,发送的语句中包含了in。
分页查询
在dao层书写新方法,主要通过下面两个方法控制分页
setFirstResult()方法,从那一条记录开始
setMaxResults()方法每页中最多放几条记录。
测试方法
运行结果可以看到里面出现了limit关键字。
Criteria
Criteria接口表示特定持久类的一个查询,运用的是反射机制,指的是纯粹面向对象查询,连sql的影子都看不到。该接口是通过session中的createCriteria()方法获得。
测试运用Criteria接口进行的查询,这样的查询不成熟.
在dao层新建查询方法
测试全查,查询过程中发送的语句默认用左外连接查询,想改成其他的不行
分页查询和Query接口类似,主要更dao层的主要查询语句。
加条件用add()方法,里面用Restrictions类,调用其中的包静态方法。
排序用addOrder()方法,Order.asc(“id”)其中填写的是类的属性名称
Query
此接口执行的语言是HQL,HQL语言是hibernate自己定义的,是面向类查询的,它的语法是sql的语法,它操作的是类,是面向对象的语言。这个语言看上去很像sql,但不要被语法结构上的相似锁迷惑,HQL是非常有意识的被设计为完全面向对象的查询特点:面向类的查询语言及面向对象的查询语言,模仿SQL语法,支持大部分SQL查询使用规则。这样的语言使得开发人员写查询非常少,从而提高效率,养成面向对象的思想。
以学生班级作为例子验证HQL语言的一些特点:
对大小写敏感,但类名除外
书写测试查询的方法调用dao层的查询
public static void find(){ Student student=(Student) BaseDao.getUser("from Student where id=1"); System.out.println(student.getStuName()+"班级名称"+student.getGrade().getGradeName()); }
查询结果发送了两条sql语句
更改查询将类名之外的改为大写运行后结果一致,但当把类名改为小写后报如下错误
from student where id=1
支持关联和连接查询
更改查询时传入的语句为
Student student=(Student) BaseDao.getUser("from Student as s left outer join fetch s.grade where s.id=1");
可以查出相同的内容。连接查询fetch获得抓取的意思必须写只发一条语句,是HQL语言的优化。3张表不关联发4条语句关联的话也不是只发一条。
支持where子句查询上面已经验证。
支持聚集函数查询在聚合查询时支持select
在调用查询方法时注意,查询出来的结果是几条,根据条数选择调用单条还是全查的方法。
以查询数据库中的学生表有几条记录。
public static void findAll(){ Object obj=BaseDao.findAll("select count(*) from Student"); System.out.println(obj); }
运行结果如下:
支持表达式查询
以in为例
public static void findAll(){ @SuppressWarnings("unchecked") List<Student> students=(List<Student>) BaseDao.findAll("from Student where id in(1,3)"); for (Student student : students) { System.out.println(student.getStuName()+"班级名称"+student.getGrade().getGradeName()); } }
数据库中的内容如下:
查询结果与数据库中内容一致,发送的语句中包含了in。
分页查询
在dao层书写新方法,主要通过下面两个方法控制分页
setFirstResult()方法,从那一条记录开始
setMaxResults()方法每页中最多放几条记录。
public static List<?> findWithPage(String HQL,int row,int page){ Session session =HibernateUntil.getSession(); List<User> list=null; try { list=session.createQuery(HQL).setFirstResult(row).setMaxResults(page).list(); } catch (Exception e) { e.printStackTrace(); }finally { HibernateUntil.closeSession(session); } return list; }
测试方法
public static void findWithPage(){ List<Student> students=(List<Student>) BaseDao.findWithPage("from Student",0,2); for (Student student : students) { System.out.println(student.getStuName()+"班级名称"+student.getGrade().getGradeName()); } }
运行结果可以看到里面出现了limit关键字。
Criteria
Criteria接口表示特定持久类的一个查询,运用的是反射机制,指的是纯粹面向对象查询,连sql的影子都看不到。该接口是通过session中的createCriteria()方法获得。
测试运用Criteria接口进行的查询,这样的查询不成熟.
在dao层新建查询方法
public static List<?> findAllCriteria(Class<?> c){ Session session =HibernateUntil.getSession(); List<User> list=null; try { list=session.createCriteria(c).list(); } catch (Exception e) { e.printStackTrace(); }finally { HibernateUntil.closeSession(session); } return list; }
测试全查,查询过程中发送的语句默认用左外连接查询,想改成其他的不行
public static void findCir(){ List<Student> students=(List<Student>) BaseDao.findAllCriteria(Student.class); for (Student student : students) { System.out.println(student.getStuName()+"班级名称"+student.getGrade().getGradeName()); } }
分页查询和Query接口类似,主要更dao层的主要查询语句。
list=session.createCriteria(c).setFirstResult(0).setMaxResults(2).list();
加条件用add()方法,里面用Restrictions类,调用其中的包静态方法。
list=session.createCriteria(c).setFirstResult(0).setMaxResults(2).add(Restrictions.ilike("stuName", "%学%")).list();
排序用addOrder()方法,Order.asc(“id”)其中填写的是类的属性名称
list=session.createCriteria(c).setFirstResult(0).setMaxResults(2).add(Restrictions.ilike("stuName", "%学%")).addOrder(Order.asc("id")).list();
相关文章推荐
- Hibernate Criteria 组合查询条件
- 基于Hibernate的动态查询(HQL、Criteria、DetachedCriteria、MySQL)
- Hibernate的学习之路十七(HQL条件查询)
- Hibernate笔记:HQL查询总结(二)——条件查询
- Hibernate的动态条件查询DetachedCriteria
- JAVAEE学习——hibernate04:查询种类、HQL、Criteria、查询优化和练习为客户列表增加查询条件
- 【SSH三大框架】Hibernate基础第四篇:Hibernate的两种查询方式:hql和Criteria
- Hibernate 的三种查询方式:HQL、Criteria、Sql
- Hibernate的学习之路十七(HQL条件查询)
- Hibernate-HQL、Criteria、SQL实现查询对照以及增删改
- Hibernate和Spring整合中数据查询hql与Criteria Query
- Hibernate-HQL、Criteria、SQL实现查询对照以及增删改
- Hibernate笔记:HQL查询总结(二)——条件查询(转)
- Hibernate 的三种查询方式:HQL、Criteria、Sql
- Hibernate多对多关联映射的HQL中的in条件查询问题
- Hibernate 笔记 HQL查询:条件查询,聚集函数,子查询,导航查询
- 利用hibernate的criteria多条件查询时得到的数据有重复
- 【Java EE (Struts2 + Spring + Hibernate)开发】 :Hibernate(二)之【HQL查询|条件查询|SQL查询】
- Hibernate笔记(4)-hql查询与Criteria查询
- Hibernate动态条件查询(Criteria Query)