hibernate框架的查询方式(十九)

来源:互联网 发布:qq飞车大黄蜂高改数据 编辑:程序博客网 时间:2024/05/16 14:19

hibernate提供5中查询的方式

1. 唯一标识OID的检索方式
* session.get(对象.class,OID)
2. 对象的导航的方式
*man.getCustomer().getCust_name()
3. HQL的检索方式
* Hibernate Query Language-- Hibernate的查询语言
4. QBC的检索方式
* Query By Criteria-- 条件查询
5. SQL检索方式(了解)
* 本地的SQL检索

玩hibernate框架,推荐使用HQL和QBC。

一、OID方式(用得很多)

Customer c1 = session.get(Customer.class, 1L);

二、对象的导航的方式(用得很多)

@Testpublic void run1() {// 查询1号客户Session session = HibernateUtils.getCurrentSession();Transaction tx = session.beginTransaction();// 先使用OID的方式查询客户Customer c1 = session.get(Customer.class, 1L);System.out.println("=======================");// 查看该客户下的联系人的集合System.out.println(c1.getLinkmans().size());tx.commit();}/** * 查询联系人,属于某一个客户 */@Testpublic void run2() {Session session = HibernateUtils.getCurrentSession();Transaction tx = session.beginTransaction();// 先Linkman man = session.get(Linkman.class, 1L);System.out.println("=======================");System.out.println(man.getCustomer().getCust_name());tx.commit();}

三. HQL的检索方式(用得比较多)

1. HQL的介绍
* HQL(Hibernate Query Language) 是面向对象的查询语言, 它和 SQL 查询语言有些相似
* 在 Hibernate 提供的各种检索方式中, HQL 是使用最广的一种检索方式
2. HQL与SQL的关系
* HQL 查询语句是面向对象的,Hibernate负责解析HQL查询语句, 然后根据对象-关系映射文件中的映射信息, 把 HQL 查询语句翻译成相应的 SQL 语句. 
* HQL 查询语句中的主体是域模型中的类及类的属性
* SQL 查询语句是与关系数据库绑定在一起的. SQL查询语句中的主体是数据库表及表的字段

3.1 基本的演示

@Testpublic void run1() {Session session = HibernateUtils.getCurrentSession();Transaction tx = session.beginTransaction();// 创建hql查询接口Query query = session.createQuery(" from Customer ");// 调用list()方法,查询List<Customer> list = query.list();for (Customer customer : list) {System.out.println(customer);}tx.commit();}

3.2 支持方法链的编程风格

@Testpublic void run2() {Session session = HibernateUtils.getCurrentSession();Transaction tx = session.beginTransaction();List<Customer> list = session.createQuery(" from Customer ").list();for (Customer customer : list) {System.out.println(customer);}tx.commit();}

3.3 别名的方式

@Testpublic void run3() {Session session = HibernateUtils.getCurrentSession();Transaction tx = session.beginTransaction();// 这种写法是会报错的,不能出现*// List<Customer> list = session.createQuery(" select * from// Customer").list();// 别名好处在于,引用属性。形如:c.name, c.ageList<Customer> list = session.createQuery(" select c from Customer c ").list();for (Customer customer : list) {System.out.println(customer);}tx.commit();}

3.4 排序查询 

SQL: order by 字段asc/desc; 

HQL:关键字是一样的,order by属性

@Testpublic void run4() {Session session = HibernateUtils.getCurrentSession();Transaction tx = session.beginTransaction();List<Linkman> list = session.createQuery(" from Linkman l order by l.lkm_id desc ").list();for (Linkman man : list) {System.out.println(man);}tx.commit();}

3.5 分页查询

* Hibernate框架提供了分页的方法,咱们可以调用方法来完成分页
* 两个方法如下
* setFirstResult(a)-- 从哪条记录开始,如果查询是从第一条开启,值是0
* setMaxResults(b)-- 每页查询的记录条数

@Testpublic void run5() {Session session = HibernateUtils.getCurrentSession();Transaction tx = session.beginTransaction();Query query = session.createQuery(" from Linkman ");// 分页查询,调用方法,查询第一页的数据1-3条/*query.setFirstResult(0);query.setMaxResults(3);*/// 查询第二页的数据query.setFirstResult(3);//(当前页-1)*sizequery.setMaxResults(3);List<Linkman> list = query.list();for (Linkman man : list) {System.out.println(man);}tx.commit();}

3.6 带条件的查询

* setParameter("?号的位置,默认从0开始","参数的值"); 不用考虑参数的具体类型
* 按位置绑定参数的条件查询(指定下标值,默认从0开始)
* 按名称绑定参数的条件查询(HQL语句中的 ? 号换成 :名称 的方式)

@Testpublic void run6() {Session session = HibernateUtils.getCurrentSession();Transaction tx = session.beginTransaction();// 方式一/*Query query = session.createQuery(" from Linkman l where l.lkm_gender = ? ");query.setString(0, "male");*/// 方式二/*Query query = session.createQuery(" from Linkman l where l.lkm_gender = :gender ");query.setString("gender", "male");*/// 方式三/*Query query = session.createQuery(" from Linkman l where l.lkm_gender = ? ");query.setParameter(0, "male");*/// 方式四Query query = session.createQuery(" from Linkman l where l.lkm_gender = :gender ");query.setParameter("gender", "male");List<Linkman> list = query.list();for (Linkman man : list) {System.out.println(man);}tx.commit();}

3.7 投影查询

" from Linkman "

如上,默认情况下,查询所有,hibernate调用空的构造方法,会查询所有字段。

如果要查询某几个字段有如下方法:

/** * 只查几个字段 */@Testpublic void run7() {Session session = HibernateUtils.getCurrentSession();Transaction tx = session.beginTransaction();// 按字段查询Query query = session.createQuery(" select lkm_name, lkm_gender from Linkman ");List<Object[]> list = query.list();for (Object[] objects : list) {System.out.println(Arrays.toString(objects));}tx.commit();}

如上,它返回的是Object类型。如果要返回Linkman类型怎么办?来看投影查询

/** * 投影查询:只查几个字段  * 第一步:需要在javabean中提供对应字段的构造方法  * 第二步:hql语句发生变化  * 注意:空的构造方法一定要有的 */@Testpublic void run8() {Session session = HibernateUtils.getCurrentSession();Transaction tx = session.beginTransaction();// 默认情况下,查询所有,hibernate调用空的构造方法Query query = session.createQuery(" select new Linkman(lkm_name, lkm_gender) from Linkman ");List<Linkman> list = query.list();for (Linkman man : list) {System.out.println(man);}tx.commit();}

3.8 聚合函数

3.8.1 count

/** * 聚合函数:count() */@Testpublic void run9() {Session session = HibernateUtils.getCurrentSession();Transaction tx = session.beginTransaction();// 查询所有联系人的数量List<Number> list = session.createQuery(" select count(linkman) from Linkman linkman ").list();// List<Number> list = session.createQuery(" select count(*) from Linkman ").list();// 通过下标值去取值Long count = list.get(0).longValue();System.out.println("数量:" + count);tx.commit();}

3.8.2 sum

/** * 聚合函数:sum() avg() max() min() */@Testpublic void run10() {Session session = HibernateUtils.getCurrentSession();Transaction tx = session.beginTransaction();// 查询所有联系人的数量List<Number> list = session.createQuery(" select sum(lkm_id) from Linkman ").list();// 通过下标值去取值Long count = list.get(0).longValue();System.out.println("数量:" + count);tx.commit();}


原创粉丝点击