[关闭]
@Beeder 2017-12-22T15:49:34.000000Z 字数 4748 阅读 822

Hibernate框架操作 查询方式

javaWeb

上一篇:Hibernate框架操作 关联关系映射

唯一标识OID的检索方式

  1. session.get(对象.class,OID)
  1. //例:
  2. Customer c = session.get(Customer.class,1L);

对象导航的方式

  1. 对象.get方法
  1. //例:
  2. // 先是用OID的方式获得客户对象
  3. Customer c = session.get(Customer.class,1L);
  4. // 用对象导航的方式查看该客户下的联系人的集合
  5. System.out.println(c.getLinkmans().size());

HQL的检索方式

Hibernate Query Language ---Hibernate的查询语言

基本查询

  1. session.createQuery("from Customer").list();

使用别名的方式

  1. session.createQuery("from Customer c").list();
  2. session.createQuery("select c from Customer c").list();

排序查询

  1. /*
  2. order by 字段 asc(升序)/desc(降序)
  3. */
  4. //升序
  5. session.createQuery("from Customer order by cust_id asc").list();
  6. //降序
  7. session.createQuery("from Customer order by cust_id desc").list();

分页查询

  1. /*
  2. @param a --从哪条记录开始,如果查询是从第一条开启,值是0
  3. --a=(当前页-1)*pageSize
  4. @return query --返回query对象
  5. */
  6. query.setFirstResult(a);
  7. /*
  8. @param b --每页查询的记录条数(pageSize)
  9. @return query --返回query对象
  10. */
  11. query.setMaxResults(b);
  1. //例:
  2. // 查询联系人
  3. Query query = session.createQuery("from Linkman");
  4. // 分页查询,调用方法,查询第1页的数据 1-3条 (当前页-1)*pageSize=0
  5. query.setFirstResult(0);
  6. query.setMaxResults(3);
  7. List<Linkman> list = query.list();

带条件的查询

  1. //不用考虑参数类型
  2. setParameter("?号的位置,默认从0开始","参数的值");
  1. //例:
  2. Query query = session.createQuery("from Linkman where lkm_name like ?");
  3. query.setFirstResult(0).setMaxResults(3);
  4. query.setParameter(0, "%李%");
  5. List<Linkman> list = query.list();

投影查询

    投影查询:查询某一字段的值或者某几个字段的值

普通方式

  1. //查询结果为Object集合,而非Customer集合
  2. List<Object[]> list = session.createQuery("select i.lkm_name,i.lkm_gender from Linkman i").list();

把查询结果封装成对象的方式

1、JavaBean中提供对应字段的构造方法
  1. // 必须要有的空参构造方法
  2. public Linkman() {}
  3. //带查询字段参数的构造方法
  4. public Linkman(String lkm_name, String lkm_gender) {
  5. this.lkm_name = lkm_name;
  6. this.lkm_gender = lkm_gender;
  7. }
2、使用HQL语句进行投影查询
  1. // 查询联系人
  2. Query query = session.createQuery("select new Linkman(lkm_name,lkm_gender) from Linkman");
  3. List<Linkman> list = query.list();

聚合函数查询

    聚合函数:count() sum() avg() max() min()

获取总的记录数

  1. /*Number类:Long、int等的父类
  2. 优点:list内的数据可调用***Value()方法转换为想要的数据类型
  3. */
  4. List<Number> list = session.createQuery("select count(*) from Customer").list();
  5. Long count = list.get(0).longValue();

求某字段的和

  1. List<Number> list = session.createQuery("select sum(lkm_id) from Linkman l").list();
  2. // 通过下标值取值
  3. Long count = list.get(0).longValue();

QBC的检索方式

Query By Criteria ---条件查询

基本查询

  1. List<Customer> list = session.createCriteria(Customer.class).list();

排序查询

    需要使用addOrder()的方法来设置参数,参数使用org.hibernate.criterion.Order对象
  1. /*
  2. order by 字段 asc(升序)/desc(降序)
  3. */
  4. Criteria criteria = session.createCriteria(Linkman.class);
  5. // 设置排序
  6. criteria.addOrder(Order.desc("lkm_id"));
  7. List<Linkman> list = criteria.list();

分页查询

  1. /*
  2. @param a --从哪条记录开始,如果查询是从第一条开启,值是0
  3. --a=(当前页-1)*pageSize
  4. @return criteria --返回criteria对象
  5. */
  6. criteria.setFirstResult(a);
  7. /*
  8. @param b --每页查询的记录条数(pageSize)
  9. @return criteria --返回criteria对象
  10. */
  11. criteria.setMaxResults(b);
  1. //例:
  2. Criteria criteria = session.createCriteria(Linkman.class);
  3. // 设置排序
  4. criteria.addOrder(Order.desc("lkm_id"));
  5. criteria.setFirstResult(0);
  6. criteria.setMaxResults(3);
  7. List<Linkman> list = criteria.list();

条件查询

    使用Criteria接口的add方法,用来传入条件
  1. /*
  2. 使用Restrictions的添加条件的方法,来添加条件,例如:
  3. * Restrictions.eq -- 相等
  4. * Restrictions.gt -- 大于号
  5. * Restrictions.ge -- 大于等于
  6. * Restrictions.lt -- 小于
  7. * Restrictions.le -- 小于等于
  8. * Restrictions.between -- 在之间
  9. * Restrictions.like -- 模糊查询
  10. * Restrictions.in -- 范围
  11. * Restrictions.and -- 并且
  12. * Restrictions.or -- 或者
  13. */
  14. criteria.add(Restrictions.eq(参数,值));
  1. //例:
  2. Criteria criteria = session.createCriteria(Linkman.class);
  3. // 设置排序
  4. criteria.addOrder(Order.desc("lkm_id"));
  5. // 设置查询条件
  6. criteria.add(Restrictions.or(Restrictions.eq("lkm_gender", "男"), Restrictions.gt("lkm_id", 3L)));
  7. List<Linkman> list = criteria.list();

in查询

  1. // 创建QBC查询接口
  2. Criteria criteria = session.createCriteria(Linkman.class);
  3. // SQL:select * from cst_linkman where lkm_id in (1,2,7);
  4. List<Long> params = new ArrayList<Long>();
  5. params.add(1L);
  6. params.add(2L);
  7. params.add(7L);
  8. // 使用in 方法查询
  9. criteria.add(Restrictions.in("lkm_id", params));
  10. List<Linkman> list = criteria.list();

聚合函数查询

    Projections是Hibernate提供的工具类,使用该工具类设置聚合函数查询

使用QBC的聚合函数查询,需要使用criteria.setProjection()方法

  1. Criteria criteria = session.createCriteria(Linkman.class);
  2. criteria.setProjection(Projections.count("lkm_id"));
  3. List<Number> list = criteria.list();
  4. Long count = list.get(0).longValue();

离线条件查询

    离线条件查询使用的是DetachedCriteria接口进行查询,离线条件查询对象在创建的时候,不需要使用Session对象,只是在查询的时候使用Session对象即可。
  1. //创建离线条件查询对象
  2. DetachedCriteria criteria = DetachedCriteria.forClass(Linkman.class);
  3. // 添加查询的条件
  4. criteria.add(Restrictions.eq("lkm_gender", "女"));
  5. Session session = HibernateUtils.getCurrentSession();
  6. Transaction tr = session.beginTransaction();
  7. // 查询数据
  8. List<Linkman> list = criteria.getExecutableCriteria(session).list();
  9. tr.commit();

SQL检索方式(了解)

基本语法

  1. Session session = HibernateUtils.getCurrentSession();
  2. Transaction tr = session.beginTransaction();
  3. SQLQuery sqlQuery = session.createSQLQuery("select * from cst_linkman where lkm_gender = ?");
  4. sqlQuery.setParameter(0,"男");
  5. sqlQuery.addEntity(Linkman.class);
  6. List<Linkman> list = sqlQuery.list();
  7. tr.commit();
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注