Hibernate中hql的基本查询、条件查询、排序插叙、分页查询、投影查询

hql语句和sql语句不同,当我们使用hql语句查询时,要把SQL语句的表写成 实体类的类名,字段写成实体类的属性

  1. 基本查询:查出数据库中所有的数据
    代码如下:
//基本查询,查询所有的实体
	@Test
	public void test1() {
	//获取当前线程的session
		Session s = HibernateUtils.getCurrentSession();
		Transaction t = s.beginTransaction();
		Query query = s.createQuery("from Customer");
		List list = query.list();
		for(Object o : list) {
			System.out.println(o);
		}
		t.commit();
	}

我们应当注意这段代码:

Query query = s.createQuery("from Customer");

执行的hql语句是:from Customer
但如果我们使用sql,语句是:

select * from  cst_customer(cst_customer是我数据库中的表名)

其中我们可以发现,使用hql只要把sql的表名换成实体类名就可以了,而且 select * 都可以不要

  1. 条件查询:按条件查询出数据库的数据
    代码如下:
//条件查询
	@Test
	public void test2() {
		Session s = HibernateUtils.getCurrentSession();
		Transaction t = s.beginTransaction();
		//Query query = s.createQuery("from Customer where custName = ?");
		//取别名
		Query query = s.createQuery("from Customer where custName = :custName");
		//query.setString(0, "23");
		//query.setParameter(0, "23");
		query.setParameter("custName", "23");
		List list = query.list();
		for(Object o : list) {
			System.out.println(o);
		}
		t.commit();
	}

当我们使用条件查询时,我们不仅要把表名换成实体类,还要把数据库的列名换成属性名:

from Customer where custName = ?

然后使用下面代码设置参数:

query.setString(0, "23");

可以发现我把这些代码注释掉了,这些方法不够具体,我们可以使用别名设置参数,如下代码

from Customer where custName = :custName

:后面的是别名,我们给参数赋值时可以使用一下代码就不用考虑具体参数的类型了

query.setParameter("custName", "23");
  1. 排序插叙:order by
//排序查询
	@Test
	public void test3() {
		Session s = HibernateUtils.getCurrentSession();
		Transaction t = s.beginTransaction();
		//根据custId排序
		Query query = s.createQuery("from Customer order by custId");
		List list = query.list();
		for(Object o : list) {
			System.out.println(o);
		}
		t.commit();
	}
  1. 分页查询:使用 order by ,在后面加上属性名就可以了
@Test
	public void test4() {
		Session s = HibernateUtils.getCurrentSession();
		Transaction t = s.beginTransaction();
		//查询全部数据,每页显示两条数据
		Query query = s.createQuery("from Customer");
		query.setFirstResult(0);
		query.setMaxResults(2);
		List list = query.list();
		for(Object o : list) {
			System.out.println(o);
		}
		t.commit();
	}
  1. 投影查询: 当我们在查询实体时,只需要部分实体的属性。并且希望返回的结果使用实体类封装,而不是Object[]
    使用步骤:1、查询语句需要使用new关键字
    2、在实体类中添加对应参数列表的构造函数

代码如下:

@Test
	public void test5() {
		Session s = HibernateUtils.getCurrentSession();
		Transaction t = s.beginTransaction();
		Query query = s.createQuery("select new domain.Customer(custId,custName) from  Customer");
		
		List list = query.list();
		for(Object o : list) {
			System.out.println(o);
		}
		t.commit();
	}

在实体类中添加对应参数列表的构造函数,注意无参构造函数实体类中一定不能省

public Customer(Long custId, String custName) {
		this.custId = custId;
		this.custName = custName;
	}

注意在使用hql语句时,实体类要加上路径,因为在一个工程里,当有多个相同类名,就不知道创建那个实体类了

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值