hibernate的三种查询方式

Hibernate查询方式详解
本文详细介绍了Hibernate中的三种查询方式:HQL、QBC和原生SQL查询,包括基本语法、参数设置、分页、统计等功能,并通过具体示例展示了如何在实际应用中使用这些查询方式。

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<User> userList = query.list();
  5. for(User user:userList){
  6. System.out.println(user.getUserName());
  7. }
  8. session.getTransaction().commit();

 

            带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<User> userList = 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. */

 

            获取一个不完整的对象
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();

 

                统计和分组查询
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]);

 

                    更多写法
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;

 

                      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<User> userList = query.list();
  7. for(User user:userList){
  8. System.out.println(user.getUserName());
  9. }
  10. session.getTransaction().commit();

 

                    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<User> userList = query.list();
  6. for(User user:userList){
  7. System.out.println(user.getUserName());
  8. }
  9. session.getTransaction().commit();
                      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<User> userList = query.list();
  7. for(User user:userList){
  8. System.out.println(user.getUserName());
  9. }
  10. session.getTransaction().commit();

 

二、QBC(Query By Criteria)查询

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

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

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

 

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

 

                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
                      示例
1
2
3
4
5
6
  1. Criteria c = 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")));
                        获取唯一记录
1
2
3
4
5
6
7
8
9
10
  1. session.beginTransaction();
  2. Criteria c = session.createCriteria(User.class);
  3. c.add(Restrictions.eq("id", 120));
  4. User user = (User) c.uniqueResult();
  5. System.out.println(user.getUserName());
  6. session.getTransaction().commit();

 

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

                       分组与统计

1
2
3
4
5
6
7
8
9
10
  1. session.beginTransaction();
  2. Criteria c = session.createCriteria(User.class);
  3. c.setProjection(Projections.sum("id"));
  4. Object obj = c.uniqueResult();
  5. System.out.println(obj);
  6. session.getTransaction().commit();
                    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 对指定的属性进行分组查询

 

                    多个统计与分组
1
2
3
4
5
6
7
8
9
10
11
12
13
14
  1. session.beginTransaction();
  2. Criteria c = 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]);

 

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

三、原生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();

 

                  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<User> list = query.list();
  6. for(User user : list){
  7. System.out.println(user.getUserName());
  8. }
  9. session.getTransaction().commit();

 

              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 = (User) query.uniqueResult();
  5. System.out.println(user.getUserName());
  6. session.getTransaction().commit();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值