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

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);

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

	@Test
	public 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();
	}
	
	/**
	 * 查询联系人,属于某一个客户
	 */
	@Test
	public 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 基本的演示

	@Test
	public 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 支持方法链的编程风格

	@Test
	public 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 别名的方式

	@Test
	public void run3() {
		Session session = HibernateUtils.getCurrentSession();
		Transaction tx = session.beginTransaction();

		// 这种写法是会报错的,不能出现*
		// List<Customer> list = session.createQuery(" select * from
		// Customer").list();

		// 别名好处在于,引用属性。形如:c.name, c.age
		List<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属性

	@Test
	public 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)-- 每页查询的记录条数

	@Test
	public 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)*size
		query.setMaxResults(3);

		List<Linkman> list = query.list();

		for (Linkman man : list) {
			System.out.println(man);
		}

		tx.commit();
	}

3.6 带条件的查询

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

	@Test
	public 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调用空的构造方法,会查询所有字段。

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

	/**
	 * 只查几个字段
	 */
	@Test
	public 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语句发生变化 
	 * 注意:空的构造方法一定要有的
	 */
	@Test
	public 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()
	 */
	@Test
	public 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()
	 */
	@Test
	public 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();
	}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值