hibernate的三种查询方式

Hibernate的查询方式

hibernate的查询方式常见的主要分为三种: HQL, QBC(命名查询), 以及使用原生SQL查询(SqlQuery)

一、HQL查询

• HQL(Hibernate Query Language)提供了丰富灵活的查询方式,使用HQL进行查询也是Hibernate官方推荐使用的查询方式。

• HQL在语法结构上和SQL语句十分的相同,所以可以很快的上手进行使用。使用HQL需要用到Hibernate中的Query对象,该对象专门执行HQL方式的操作。

     查询所有示例
1
2
3
4
5
6
7
8
  1.  
    session.beginTransaction();
  2.  
    String hql "from User"// from 后跟的是要查询的对象,而不是表
  3.  
    Query query session.createQuery(hql);
  4.  
    List<UseruserList query.list();
  5.  
    for(User user:userList){
  6.  
    System.out.println(user.getUserName());
  7.  
    }
  8.  
    session.getTransaction().commit();
  9.  
     

 

            带where的查询示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
  1.  
    session.beginTransaction();
  2.  
    String hql "from User where userName = 'James'";
  3.  
    Query query session.createQuery(hql);
  4.  
    List<UseruserList query.list();
  5.  
    for(User user:userList){
  6.  
    System.out.println(user.getUserName());
  7.  
    }
  8.  
    session.getTransaction().commit();
  9.  
    /*
  10.  
    在HQL中where语句中使用的是持久化对象的属性名,如上面示例中的userName。当然在HQL中也可以使用别名
  11.  
    */
  12.  
    String hql "from User as u where u.userName = 'James'";
  13.  
    /*
  14.  
    过滤条件
  15.  
    在where语句中还可以使用各种过滤条件,如:=、<>、<、>、>=、<=、between、not between、
  16.  
    in、not in、is、like、and、or等
  17.  
    */
  18.  
     

 

            获取一个不完整的对象
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
  1.  
    session.beginTransaction();
  2.  
    String hql "select userName from User";
  3.  
    Query query session.createQuery(hql);
  4.  
    List<Object> nameList query.list();
  5.  
    for(Object obj:nameList){
       String name=(String)obj;
       System.out.println(name);
  6.  
    }
  7.  
    session.getTransaction().commit();
  8.  
    // 多个属性的话,需要用object[]接收
  9.  
    session.beginTransaction();
  10.  
    String hql "select userName,userPwd from User";
  11.  
    Query query session.createQuery(hql);
  12.  
    List nameList query.list();
  13.  
    for(Object obj:nameList){
  14.  
    Object[] array (Object[]) obj// 转成object[]
  15.  
    System.out.println("name:" array[0]);
  16.  
    System.out.println("pwd:" array[1]);
  17.  
    }
  18.  
    session.getTransaction().commit();
  19.  
     

 

                统计和分组查询
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
  1.  
    session.beginTransaction();
  2.  
    String hql "select count(*),max(id) from User";
  3.  
    Query query session.createQuery(hql);
  4.  
    List nameList query.list();
  5.  
    for(Object obj:nameList){
  6.  
    Object[] array (Object[]) obj;
  7.  
    System.out.println("count:" array[0]);
  8.  
    System.out.println("max:" array[1]);
  9.  
    }
  10.  
    session.getTransaction().commit();
  11.  
    /*
  12.  
    该条sql语句返回的是单条数据,所以还可以这样写
  13.  
    单列数据用Object,多列数据用Object[]
  14.  
    */
  15.  
    Object[] object (Object[]) query.uniqueResult();
  16.  
    System.out.println("count:" object[0]);
  17.  
    System.out.println("max:" object[1]);
  18.  
     

 

                    更多写法
1
2
3
4
5
6
7
  1.  
    select distinct name from Student;
  2.  
    select max(age) from Student;
  3.  
    select count(age),age from Student group by age;
  4.  
    from Student order by age;
  5.  
     

 

                      HQL占位符
1
2
3
4
5
6
7
8
9
10
11
12
  1.  
    session.beginTransaction();
  2.  
    String hql "from User where userName = ?";
  3.  
    Query query session.createQuery(hql);
  4.  
    // 索引从0开始
  5.  
    query.setString(0"James");
  6.  
    List<UseruserList query.list();
  7.  
    for(User user:userList){
  8.  
    System.out.println(user.getUserName());
  9.  
    }
  10.  
    session.getTransaction().commit();
  11.  
     

 

                    HQL引用占位符
1
2
3
4
5
6
7
8
9
10
11
12
13
  1.  
    session.beginTransaction();
  2.  
    String hql "from User where userName = :name";
  3.  
    Query query session.createQuery(hql);
  4.  
    query.setParameter("name""James");
  5.  
    List<UseruserList query.list();
  6.  
    for(User user:userList){
  7.  
    System.out.println(user.getUserName());
  8.  
    }
  9.  
    session.getTransaction().commit();
  10.  
     
                      HQL分页
1
2
3
4
5
6
7
8
9
10
11
12
  1.  
    session.beginTransaction();
  2.  
    String hql "from User";
  3.  
    Query query session.createQuery(hql);
  4.  
    query.setFirstResult(0);
  5.  
    query.setMaxResults(2);
  6.  
    List<UseruserList query.list();
  7.  
    for(User user:userList){
  8.  
    System.out.println(user.getUserName());
  9.  
    }
  10.  
    session.getTransaction().commit();
  11.  
     

 

二、QBC(Query By Criteria)查询

• Criteria对象提供了一种面向对象的方式查询数据库。Criteria对象需要使用Session对象来获得。

• 一个Criteria对象表示对一个持久化类的查询。

                        查询所有
1
2
3
4
5
6
7
8
9
10
11
  1.  
    session.beginTransaction();
  2.  
    Criteria session.createCriteria(User.class);
  3.  
    List<UseruserList c.list();
  4.  
    for(User user:userList){
  5.  
    System.out.println(user.getUserName());
  6.  
    }
  7.  
    session.getTransaction().commit();
  8.  
     

 

                        where
1
2
3
4
5
6
7
8
9
10
11
  1.  
    session.beginTransaction();
  2.  
    Criteria session.createCriteria(User.class);
  3.  
    c.add(Restrictions.eq("userName""James"));
  4.  
    List<UseruserList c.list();
  5.  
    for(User user:userList){
  6.  
    System.out.println(user.getUserName());
  7.  
    }
  8.  
    session.getTransaction().commit();
  9.  
     

 

                Restrictions对象
1
2
3
4
5
6
7
8
9
10
11
12
  1.  
    方法名称 对应SQL中的表达式
  2.  
    ----------------------------------------------------------
  3.  
    Restrictions.eq field = value
  4.  
    Restrictions.gt field > value
  5.  
    Restrictions.lt field value
  6.  
    Restrictions.ge field >= value
  7.  
    Restrictions.le field <value
  8.  
    Restrictions.between field between value1 and value2
  9.  
    Restrictions.in field in(…)
  10.  
    Restrictions.and and
  11.  
    Restrictions.or or
  12.  
    Restrictions.like field like value
  13.  
     
                      示例
1
2
3
4
5
6
  1.  
    Criteria session.createCriteria(User.class);
  2.  
    c.add(Restrictions.like("userName""J"));
  3.  
    c.add(Restrictions.eq("id"120));
  4.  
    c.add(Restrictions.or(Restrictions.eq("userName""James"),
  5.  
    Restrictions.eq("userName""Alex")));
  6.  
     
                        获取唯一记录
1
2
3
4
5
6
7
8
9
10
  1.  
    session.beginTransaction();
  2.  
    Criteria session.createCriteria(User.class);
  3.  
    c.add(Restrictions.eq("id"120));
  4.  
    User user (Userc.uniqueResult();
  5.  
    System.out.println(user.getUserName());
  6.  
    session.getTransaction().commit();
  7.  
     

 

                      分页
1
2
3
4
  1.  
    Criteria session.createCriteria(User.class);
  2.  
    c.setFirstResult(0);
  3.  
    c.setMaxResults(5);
  4.  
     

                       分组与统计

1
2
3
4
5
6
7
8
9
10
  1.  
    session.beginTransaction();
  2.  
    Criteria session.createCriteria(User.class);
  3.  
    c.setProjection(Projections.sum("id"));
  4.  
    Object obj c.uniqueResult();
  5.  
    System.out.println(obj);
  6.  
    session.getTransaction().commit();
  7.  
     
                    Projections对象
1
2
3
4
5
6
7
8
9
  1.  
    方法名称 描述
  2.  
    -------------------------------------------------------
  3.  
    Projections.sum 等于SQL中聚合函数sum
  4.  
    Projections.avg 等于SQL中聚合函数avg
  5.  
    Projections.count 等于SQL中聚合函数count
  6.  
    Projections .distinct 去除重复记录
  7.  
    Projections.max 等于SQL中聚合函数max
  8.  
    Projections.min 等于SQL中聚合函数min
  9.  
    Projections .groupProperty 对指定的属性进行分组查询
  10.  
     

 

                    多个统计与分组
1
2
3
4
5
6
7
8
9
10
11
12
13
14
  1.  
    session.beginTransaction();
  2.  
    Criteria session.createCriteria(User.class);
  3.  
    ProjectionList projectionList Projections.projectionList();
  4.  
    projectionList.add(Projections.sum("id"));
  5.  
    projectionList.add(Projections.min("id"));
  6.  
    c.setProjection(projectionList);
  7.  
    // 和HQL一样,单列用Object,多列用Object[]
  8.  
    Object[] obj (Object[]) c.uniqueResult();
  9.  
    System.out.println("sum:" obj[0]);
  10.  
    System.out.println("min:" obj[1]);
  11.  
     

 

                      排序
1
2
3
  1.  
    Criteria session.createCriteria(User.class);
  2.  
    c.addOrder(Order.desc("id"));
  3.  
     

三、原生SQL查询:

                       示例
1
2
3
4
5
6
7
8
9
10
11
12
  1.  
    session.beginTransaction();
  2.  
    String sql "select id,username,userpwd from t_user";
  3.  
    List list session.createSQLQuery(sql).list();
  4.  
    for(Object item list){
  5.  
    Object[] rows (Object[]) item;
  6.  
    System.out.println("id:" rows[0"username:"
  7.  
    rows[1"userpwd:" rows[2]);
  8.  
    }
  9.  
    session.getTransaction().commit();
  10.  
     

 

                  addEntity()示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
  1.  
    session.beginTransaction();
  2.  
    String sql "select id,username,userpwd from t_user";
  3.  
    // addEntity()可以告诉Hibernate你想要封装成对象的类型,然后自动为你封装
  4.  
    SQLQuery query session.createSQLQuery(sql).addEntity(User.class);
  5.  
    List<Userlist query.list();
  6.  
    for(User user list){
  7.  
    System.out.println(user.getUserName());
  8.  
    }
  9.  
    session.getTransaction().commit();
  10.  
     

 

              uniqueResult示例
1
2
3
4
5
6
7
8
9
10
  1.  
    session.beginTransaction();
  2.  
    String sql "select id,username,userpwd from t_user where id = 2";
  3.  
    SQLQuery query session.createSQLQuery(sql).addEntity(User.class);
  4.  
    User user (Userquery.uniqueResult();
  5.  
    System.out.println(user.getUserName());
  6.  
    session.getTransaction().commit();
  7.  
posted @ 2020-01-02 23:43  愿世界对你温柔相待  Views(68)  Comments(0)    收藏  举报