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

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章