加载中...

Hibernate(十二)Criteria查询


一、简述

Criteria是一种比hql更面向对象的查询方式。Criteria 可使用 Criterion 和 Projection 设置查询条件。可以设置 FetchMode(联合查询抓取的模式 ) ,设置排序方式,Criteria 还可以设置 FlushModel (冲刷 Session 的方式)和 LockMode (数据库锁模式)。

Criteria本身只是查询的容器。Criteria查询又称对象查询

Criteria查询采用面向对象的方式封装查询条件。由Hibernater自动生成SQL查询语句

二、不带查询条件

 建立数据表

  1. create table login
  2. (
  3. username varchar2(32) primary key,
  4. password varchar2(32) not null ,
  5. age number(3)
  6. );
  7. insert into login
  8. select '张三','123456',21 from dual union
  9. select 'Tom','123123',34 from dual union
  10. select 'Jack','12345678',34 from dual union
  11. select '李四','qwerty',23 from dual;
  12. commit;

建立持久化类和配置文件

Hibernate.cfg.xml配置文件

  1. <?xml version='1.0' encoding='UTF-8'?>
  2. <!DOCTYPE hibernate-configuration PUBLIC
  3. "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
  4. "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
  5. <hibernate-configuration>
  6.  
  7. <session-factory>
  8. <property name="dialect">
  9. org.hibernate.dialect.Oracle9Dialect
  10. </property>
  11. <property name="connection.url">
  12. jdbc:oracle:thin:@localhost:1521:orcl
  13. </property>
  14. <property name="connection.username">root</property>
  15. <property name="connection.password">root</property>
  16. <property name="connection.driver_class">
  17. oracle.jdbc.OracleDriver
  18. </property>
  19. <property name="show_sql">true</property>
  20. <property name="format_sql">true</property>
  21. <mapping resource="entity/Login.hbm.xml" />
  22.  
  23. </session-factory>
  24.  
  25. </hibernate-configuration>

持久化类和配置文件 

  1. package entity;
  2. public class Login implements java.io.Serializable {
  3. // Fields
  4.  
  5. /**
  6. *
  7. */
  8. private static final long serialVersionUID = 1L;
  9. private String username;
  10. private String password;
  11. private int age;
  12. // Constructors
  13.  
  14. /** default constructor */
  15. public Login() {
  16. }
  17. /** minimal constructor */
  18. public Login(String username, String password) {
  19. this.username = username;
  20. this.password = password;
  21. }
  22. /** full constructor */
  23. public Login(String username, String password, int age) {
  24. this.username = username;
  25. this.password = password;
  26. this.age = age;
  27. }
  28. // Property accessors
  29.  
  30. public String getUsername() {
  31. return this.username;
  32. }
  33. public void setUsername(String username) {
  34. this.username = username;
  35. }
  36. public String getPassword() {
  37. return this.password;
  38. }
  39. public void setPassword(String password) {
  40. this.password = password;
  41. }
  42. public int getAge() {
  43. return this.age;
  44. }
  45. public void setAge(int age) {
  46. this.age = age;
  47. }
  48. }

配置文件Login.hbm.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  3. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
  4.  
  5. <hibernate-mapping>
  6. <class name="entity.Login" table="LOGIN" schema="ROOT">
  7. <id name="username" type="java.lang.String">
  8. <column name="USERNAME" length="32" />
  9. <generator class="assigned" />
  10. </id>
  11. <property name="password" type="java.lang.String">
  12. <column name="PASSWORD" length="32" not-null="true" />
  13. </property>
  14. <property name="age" type="java.lang.Integer">
  15. <column name="AGE" precision="3" scale="0" />
  16. </property>
  17. </class>
  18. </hibernate-mapping>

测试类:

  1. package demo;
  2. import java.util.List;
  3. import org.hibernate.Criteria;
  4. import org.hibernate.HibernateException;
  5. import org.hibernate.Session;
  6. import org.hibernate.SessionFactory;
  7. import org.hibernate.cfg.Configuration;
  8. import entity.Login;
  9. public class Demo1 {
  10. /**
  11. * Criteria无查询条件查询所有
  12. */
  13. public static void main(String[] args) {
  14. //声明一个集合用来接收结果
  15. List<Login> result=null;
  16. //声明SessionFactory
  17. SessionFactory factory=null;
  18. //声明Session
  19. Session session=null;
  20. //初始化以上对象
  21. try{
  22. factory=new Configuration().configure().buildSessionFactory();
  23. session=factory.openSession();
  24. //声明Criteria对象传入一个持久化类对象类型
  25. Criteria criteria=session.createCriteria(Login.class);
  26. //查询使用list方法
  27. result=criteria.list();
  28. }catch(HibernateException e){
  29. e.printStackTrace();
  30. }finally{
  31. session.close();
  32. factory.close();
  33. }
  34. //输出结果
  35. for (Login login : result) {
  36. System.out.println("用户名:"+login.getUsername()+" 密码:"+login.getPassword()+" 年龄:"+login.getAge());
  37. }
  38. }
  39. }

结果:

  1. Hibernate:
  2. select
  3. this_.USERNAME as USERNAME0_0_,
  4. this_.PASSWORD as PASSWORD0_0_,
  5. this_.AGE as AGE0_0_
  6. from
  7. ROOT.LOGIN this_
  8. 用户名:Jack 密码:12345678 年龄:34
  9. 用户名:Tom 密码:123123 年龄:34
  10. 用户名:李四 密码:qwerty 年龄:23
  11. 用户名:张三 密码:123456 年龄:21

三、添加查询条件

3.1、加入一个username的条件

  1. //声明Criteria对象传入一个持久化类对象类型
  2. Criteria criteria=session.createCriteria(Login.class);
  3. //添加查询条件 Restrictions.eq是等于的意思,2个参数,第一个为持久化类的属性,第2个为比较的参数值
  4. criteria.add(Restrictions.eq("username", "Tom"));
  5. //查询使用list方法
  6. result=criteria.list();

执行的SQL

  1. select
  2. this_.USERNAME as USERNAME0_0_,
  3. this_.PASSWORD as PASSWORD0_0_,
  4. this_.AGE as AGE0_0_
  5. from
  6. ROOT.LOGIN this_
  7. where
  8. this_.USERNAME=?

3.2、多个查询条件AND--between

  1. //年龄在大于等于25
  2. criteria.add(Restrictions.le("age", 25));
  3. //年龄小于等于23
  4. criteria.add(Restrictions.ge("age", 23));

或者

  1. //年年龄大于23小于25之间的记录
  2. criteria.add(Restrictions.between("age", 23, 25));

执行的SQL

  1. select
  2. this_.USERNAME as USERNAME0_0_,
  3. this_.PASSWORD as PASSWORD0_0_,
  4. this_.AGE as AGE0_0_
  5. from
  6. ROOT.LOGIN this_
  7. where
  8. this_.AGE<=?
  9. and this_.AGE>=?
  1. select
  2. this_.USERNAME as USERNAME0_0_,
  3. this_.PASSWORD as PASSWORD0_0_,
  4. this_.AGE as AGE0_0_
  5. from
  6. ROOT.LOGIN this_
  7. where
  8. this_.AGE between ? and ?

3.3、多个查询条件或者条件 or

  1. criteria.add(Restrictions.or(Restrictions.eq("age", 23), Restrictions.like("username", "%李%")));
  2. //或者以下写法直接使用SQL语句
  3. criteria.add(Restrictions.sqlRestriction("age=20 or username like '%李%'"));

执行SQL

  1. select
  2. this_.USERNAME as USERNAME0_0_,
  3. this_.PASSWORD as PASSWORD0_0_,
  4. this_.AGE as AGE0_0_
  5. from
  6. ROOT.LOGIN this_
  7. where
  8. (
  9. this_.AGE=?
  10. or this_.USERNAME like ?
  11. )

直接使用SQL的执行语句

  1. select
  2. this_.USERNAME as USERNAME0_0_,
  3. this_.PASSWORD as PASSWORD0_0_,
  4. this_.AGE as AGE0_0_
  5. from
  6. ROOT.LOGIN this_
  7. where
  8. age=20
  9. or username like '%李%'

四、Restrictions常用方法

五、常用方法使用

  1. package demo;
  2. import java.util.List;
  3. import org.hibernate.Criteria;
  4. import org.hibernate.HibernateException;
  5. import org.hibernate.Session;
  6. import org.hibernate.SessionFactory;
  7. import org.hibernate.cfg.Configuration;
  8. import org.hibernate.criterion.Restrictions;
  9. import entity.Login;
  10. public class Demo1 {
  11. /**
  12. * Criteria无查询条件查询所有
  13. */
  14. public static void main(String[] args) {
  15. //声明一个集合用来接收结果
  16. List<Login> result=null;
  17. //声明SessionFactory
  18. SessionFactory factory=null;
  19. //声明Session
  20. Session session=null;
  21. //初始化以上对象
  22. try{
  23. factory=new Configuration().configure().buildSessionFactory();
  24. session=factory.openSession();
  25. //声明Criteria对象传入一个持久化类对象类型
  26. Criteria criteria=session.createCriteria(Login.class);
  27. //1.查询用户名为Tom的记录
  28. //criteria.add(Restrictions.eq("username", "Tom"));
  29. //2.查询年龄大于等于21同时小于等于25的记录
  30. //criteria.add(Restrictions.ge("age", 21));
  31. //criteria.add(Restrictions.le("age", 25));
  32. //between写法
  33. //criteria.add(Restrictions.between("age", 21, 25));
  34. //3.或者查询年龄=21或者名字中有李的记录
  35. //criteria.add(Restrictions.or(Restrictions.eq("age", 21), Restrictions.like("username", "%李%")));
  36. //sql写法
  37. //criteria.add(Restrictions.sqlRestriction("age=21 or username like '%李%'"));
  38. //4.年龄在21,23,25的记录
  39. //criteria.add(Restrictions.in("age", new Integer []{21,23,25}));
  40. //5.and用法
  41. criteria.add(Restrictions.and(Restrictions.ge("age", 23), Restrictions.like("username", "%T%")));
  42. //查询使用list方法
  43. result=criteria.list();
  44. }catch(HibernateException e){
  45. e.printStackTrace();
  46. }finally{
  47. session.close();
  48. factory.close();
  49. }
  50. System.out.println("==========");
  51. //输出结果
  52. for (Login login : result) {
  53. System.out.println("用户名:"+login.getUsername()+" 密码:"+login.getPassword()+" 年龄:"+login.getAge());
  54. }
  55. }
  56. }

 六、对结果进行排序

使用Order关键字,进行排序

criteria.addOrder(Order.desc(属性名称));降序

criteria.addOrder(Order.asc(属性名称));升序

  1. //按年龄降序排序
  2. criteria.addOrder(Order.desc("age"));
  3. //按姓名升序排序
  4. criteria.addOrder(Order.asc("username"));
  5. //查询使用list方法
  6. result=criteria.list();
  7. //输出结果
  8. for (Login login : result) {
  9. System.out.println("用户名:"+login.getUsername()+" 密码:"+login.getPassword()+" 年龄:"+login.getAge());
  10. }

七、示例查询

  1. package demo;
  2. import java.util.List;
  3. import org.hibernate.Criteria;
  4. import org.hibernate.HibernateException;
  5. import org.hibernate.Session;
  6. import org.hibernate.SessionFactory;
  7. import org.hibernate.cfg.Configuration;
  8. import org.hibernate.criterion.Example;
  9. import org.hibernate.criterion.Order;
  10. import org.hibernate.criterion.Restrictions;
  11. import entity.Login;
  12. public class Demo2 {
  13. /**
  14. * Criteria无查询条件查询所有
  15. */
  16. public static void main(String[] args) {
  17. //声明一个集合用来接收结果
  18. List<Login> result=null;
  19. //声明SessionFactory
  20. SessionFactory factory=null;
  21. //声明Session
  22. Session session=null;
  23. //声明一个Login对象,并赋值可以是多个 但不能是主键
  24. Login user=new Login();
  25. user.setAge(21);
  26. //初始化以上对象
  27. try{
  28. factory=new Configuration().configure().buildSessionFactory();
  29. session=factory.openSession();
  30. //声明Criteria对象传入一个持久化类对象类型
  31. Criteria criteria=session.createCriteria(Login.class);
  32. //加入查询条件
  33. criteria.add(Example.create(user));
  34. //查询使用list方法
  35. result=criteria.list();
  36. }catch(HibernateException e){
  37. e.printStackTrace();
  38. }finally{
  39. session.close();
  40. factory.close();
  41. }
  42. System.out.println("==========");
  43. //输出结果
  44. for (Login login : result) {
  45. System.out.println("用户名:"+login.getUsername()+" 密码:"+login.getPassword()+" 年龄:"+login.getAge());
  46. }
  47. }
  48. }

八、聚合函数

 

  1. package demo;
  2. import java.util.Iterator;
  3. import java.util.List;
  4. import org.hibernate.Criteria;
  5. import org.hibernate.HibernateException;
  6. import org.hibernate.Session;
  7. import org.hibernate.SessionFactory;
  8. import org.hibernate.cfg.Configuration;
  9. import org.hibernate.criterion.ProjectionList;
  10. import org.hibernate.criterion.Projections;
  11. import entity.Login;
  12. public class Demo3 {
  13. /**
  14. * Criteria无查询条件查询所有
  15. */
  16. public static void main(String[] args) {
  17. //声明一个集合用来接收结果
  18. List<Login> result=null;
  19. //声明SessionFactory
  20. SessionFactory factory=null;
  21. //声明Session
  22. Session session=null;
  23. //初始化以上对象
  24. try{
  25. factory=new Configuration().configure().buildSessionFactory();
  26. session=factory.openSession();
  27. //声明Criteria对象传入一个持久化类对象类型
  28. Criteria criteria=session.createCriteria(Login.class);
  29. //加入查询条件
  30. //总记录数
  31. //criteria.setProjection(Projections.rowCount());
  32. //平均年龄
  33. //criteria.setProjection(Projections.avg("age"));
  34. //分组
  35. criteria.setProjection(Projections.groupProperty("username"));
  36. //查询使用list方法
  37. result=criteria.list();
  38. //System.out.println("平均年龄:"+result.iterator().next());
  39. //System.out.println("总记录数:"+result.iterator().next());
  40. Iterator iterator=result.iterator();
  41. while(iterator.hasNext()){
  42. System.out.println(iterator.next());
  43. }
  44. }catch(HibernateException e){
  45. e.printStackTrace();
  46. }finally{
  47. session.close();
  48. factory.close();
  49. }
  50. }
  51. }

 分页

  1. package demo;
  2. import java.util.List;
  3. import org.hibernate.Criteria;
  4. import org.hibernate.HibernateException;
  5. import org.hibernate.Session;
  6. import org.hibernate.SessionFactory;
  7. import org.hibernate.cfg.Configuration;
  8. import org.hibernate.criterion.Order;
  9. import org.hibernate.criterion.Restrictions;
  10. import entity.Login;
  11. public class Demo4 {
  12. /**
  13. * Criteria无查询条件查询所有
  14. */
  15. public static void main(String[] args) {
  16. //声明一个集合用来接收结果
  17. List<Login> result=null;
  18. //声明SessionFactory
  19. SessionFactory factory=null;
  20. //声明Session
  21. Session session=null;
  22. //当前页数第几页
  23. int pageIndex=1;
  24. //最大显示记录数
  25. int pageSize=2;
  26. //初始化以上对象
  27. try{
  28. factory=new Configuration().configure().buildSessionFactory();
  29. session=factory.openSession();
  30. //声明Criteria对象传入一个持久化类对象类型
  31. Criteria criteria=session.createCriteria(Login.class);
  32. //起始记录数
  33. criteria.setFirstResult((pageIndex-1)*pageSize);
  34. //每页显示最大记录数
  35. criteria.setMaxResults(pageSize);
  36. //查询使用list方法
  37. result=criteria.list();
  38. }catch(HibernateException e){
  39. e.printStackTrace();
  40. }finally{
  41. session.close();
  42. factory.close();
  43. }
  44. System.out.println("==========");
  45. //输出结果
  46. for (Login login : result) {
  47. System.out.println("用户名:"+login.getUsername()+" 密码:"+login.getPassword()+" 年龄:"+login.getAge());
  48. }
  49. }
  50. }

 


还没有评论.