Hibernate框架学习_三种查询

分类:

Hibernate共分为三种查询:HQL,Criteria,原生SQL

HQL查询:(适合不复杂的多表查询)

Hibernate自创操作数据库的查询语言,属于面向对象的查询语言.

HQL不会出现任何数据库相关的信息

1.基本查询:

@Test
	public void testHqlBase(){
		Session session = HibernateUtils.openSession();
		Transaction tx = session.beginTransaction();
		//操作---
//		hql语句
		String hql = "from Customer";
//		根据hql语句创建查询对象
		Query query = session.createQuery(hql);
//		获得多个查询结果
		List<Customer> list = query.list();
		System.out.println(list);
		//提交
		tx.commit();
//		关闭资源
		session.close();
	}

使用createQuery()来创建查询对象

这里的hql语句与sql语句不同,hql语句本是这样的:select * from Customer,但是因为是查询*,所以可以省略select *,然后from后的并非数据库表,因为hql是面向对象的,所以其实这个Customer是实体类.请看上面标红的那句话!

然后执行hql语句是使用的session的createQuery(hql),获得多个数据使用list(),获得单个数据使用uniqueResult()方法

2.条件查询

@Test
	public void testHql1(){
		Session session = HibernateUtils.openSession();
		Transaction tx = session.beginTransaction();
		//操作---
//		hql语句
		//Customer:实体类,cust_id:实体类属性
		String hql = "from Customer where cust_id = 1";
//		根据hql语句创建查询对象
		Query query = session.createQuery(hql);
//		获得多个查询结果
		Customer u = (Customer) query.uniqueResult();
		
		System.out.println(u);
		//提交
		tx.commit();
//		关闭资源
		session.close();
	}

注意hql语句中没有数据库的东西就可以,

当然,我们也可以使用占位符?

于是就要用到setParameter()方法来给占位符赋值了

类似这样:

如果在项目中?的顺序总是改变,这时候我们使用?作为占位符就不太好用了因此,hibernate给我们准备了另外一种自定义占位符

这里故意写了ccc为的就是说明这是自定义的,而我们一般规范的写cust_id,但其实写什么都可以的!

3.分页查询

@Test
	public void testHql2(){
		Session session = HibernateUtils.openSession();
		Transaction tx = session.beginTransaction();
		//操作---
//		hql语句
		//Customer:实体类,cust_id:实体类属性
		String hql = "from Customer";
//		根据hql语句创建查询对象
		Query query = session.createQuery(hql);
//		设置第一个占位符?
		query.setFirstResult(0);
		query.setMaxResults(1);
//		获得多个查询结果
		List<Customer> list = query.list();
		System.out.println(list);
		//提交
		tx.commit();
//		关闭资源
		session.close();
	}

这里要注意hql语句中没有limit,而是使用了setFirstResult()与setMaxResult()来设置limit?,?的两个占位符

Criteria查询:(适合单表条件查询)

hibernate自创,彻底无语句面向对象查询.

1.基本查询

@Test
	public void testCriteria1() {
		// TODO Auto-generated method stub
		Session session = HibernateUtils.openSession();
		Transaction tx = session.beginTransaction();
//		创建Criteria查询对象
		Criteria c = session.createCriteria(Customer.class);
		List<Customer> list = c.list();
		System.out.println(list);
//		提交
		tx.commit();
		//关闭
		session.close();
	}

使用createCriteria()创建Criteria查询对象.

因为是,无语句,所以也就没有了hql的什么form class了,所以我们在创建了查询对象时就指定返回的是那个实体类.
 

2.条件查询

@Test
	public void testCriteria2() {
		// TODO Auto-generated method stub
		Session session = HibernateUtils.openSession();
		Transaction tx = session.beginTransaction();
//		创建Criteria查询对象
		Criteria c = session.createCriteria(Customer.class);
//		添加查询参数
		c.add(Restrictions.eq("cust_id", 1l));
//		获得查询结果
		Customer r = (Customer) c.uniqueResult();
		System.out.println(r);
//		提交
		tx.commit();
		//关闭
		session.close();
	}

条件查询,这里使用了一个Restrictions类提供众多的方法,比如isNull()等

3.分页查询

@Test
	public void testCriteria3() {
		// TODO Auto-generated method stub
		Session session = HibernateUtils.openSession();
		Transaction tx = session.beginTransaction();
//		创建Criteria查询对象
		Criteria c = session.createCriteria(Customer.class);
		c.setFirstResult(0);
		c.setMaxResults(1);
		List<Customer> list = c.list();
		System.out.println(list);
//		提交
		tx.commit();
		//关闭
		session.close();
	}

这里与Hql差不多,如果我们要分页的话还要知道总行数,这里就用到了聚合函数获得总行数的需求

使用如下代码,设置查询的聚合函数:

//		创建Criteria查询对象
		Criteria c = session.createCriteria(Customer.class);
		c.setProjection(Projections.rowCount());
		Long count = (Long) c.uniqueResult();

原生SQL

1.基本查询

@Test
	public void testSql() {
		// TODO Auto-generated method stub
		Session session = HibernateUtils.openSession();
		Transaction tx = session.beginTransaction();
		String sql = "select * from cst_customer";
		SQLQuery query = session.createSQLQuery(sql);
		List<Object[]> list = query.list();
		for(Object[] objs : list){
			System.out.println(Arrays.toString(objs));
		}
		//关闭资源
		session.close();
	}

这个应该很熟悉,只是生成查询对象的方法是createSQLQuery(),然后查询的每一行是一个Object[]数组,如果我们先用对象Customer代替Object[]请看下边,使用addEntity(class)

2.条件查询

@Test
	public void testSql2() {
		// TODO Auto-generated method stub
		Session session = HibernateUtils.openSession();
		Transaction tx = session.beginTransaction();
		String sql = "select * from cst_customer where cust_id = ?";
		SQLQuery query = session.createSQLQuery(sql);
		query.addEntity(Customer.class);
		query.setParameter(0, 1);
		List<Customer> list = query.list();
		System.out.println(list);
		//关闭资源
		session.close();
	}

其中,因为使用了addEntity(class)方法,所以查询结果返回的不是Object[]而是Class实体类Customer,这里设置参数用到的setParameter()之前也用过.

3.分页查询

@Test
	public void testSql3() {
		// TODO Auto-generated method stub
		Session session = HibernateUtils.openSession();
		Transaction tx = session.beginTransaction();
		String sql = "select * from cst_customer limit ?,?";
		
		SQLQuery query = session.createSQLQuery(sql);
		query.addEntity(Customer.class);
		query.setParameter(0, 0);
		query.setParameter(1, 1);
		List<Customer> list = query.list();
		System.out.println(list);
		//关闭资源
		session.close();
	}
发布了94 篇原创文章 · 获赞 8 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_38827988/article/details/89923078