天天看點

Hiberante第四天

Hibernate  第四天,今天主要講解的是關于Hiberante的查詢總結

一、查詢總結:

1.oid查詢  get查詢

2.對象屬性導航查詢

3.criteria查詢

二、查詢 -HQL文法

package com.hibernate.test.hql;

import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;

import com.hibernate.test.domain.Customer;
import com.hibernate.utils.HibnerateUtils;

//學習hql文法
public class Demo {
	// 1.基本文法
	@Test
	public void fun1() {
		Session session = HibnerateUtils.opensession();
		Transaction tx = session.beginTransaction();
		// --------------------------
		// 執行操作
		String hql = "from Customer";
		// 複雜寫法
		String hql2 = "from com.hibernate.test.domain.Customer";
		String hql3 = "from java.lang.Object";

		Query query = session.createQuery(hql3);
		List list = query.list();
		System.out.println(list);
		// -------------------------
		tx.commit();
		session.close();

	}

	// 排序文法
	// 條件
	@Test
	public void fun2() {
		Session session = HibnerateUtils.opensession();
		Transaction tx = session.beginTransaction();
		// --------------------------
		// 執行操作
		String hql = "from Customer order by cust_id desc";// 降序
		String hql4 = "from Customer order by cust_id asc";// 升序
		// 複雜寫法
		String hql2 = "from com.hibernate.test.domain.Customer";
		String hql3 = "from java.lang.Object";

		Query query = session.createQuery(hql);
		List list = query.list();
		System.out.println(list);
		// -------------------------
		tx.commit();
		session.close();

	}

	// 分頁
	@Test
	public void fun3() {
		Session session = HibnerateUtils.opensession();
		Transaction tx = session.beginTransaction();
		// --------------------------
		// limit ?,?
		String hql = "from Customer ";
		Query query = session.createQuery(hql);
		query.setFirstResult(1);
		query.setMaxResults(3);
		List<Customer> list = query.list();
		System.out.println(list);
		// limit ?,?
		// (目前頁書-1)*每頁條數
		// -------------------------
		tx.commit();
		session.close();

	}
	// 統計查詢
	// count
	// sunm
	// avg
	// max
	// min

	@Test
	public void fun4() {
		Session session = HibnerateUtils.opensession();
		Transaction tx = session.beginTransaction();
		// --------------------------
		// limit ?,?
		// 求總記錄數
		String hql = "select count(*) from Customer ";
		// id求和
		String hql2 = "select sum(cust_id) from Customer ";
		// 求id平均值
		String hql3 = "select avg(cust_id) from Customer ";
		// 求id的最大值
		String hql4 = "select max(cust_id) from Customer ";
		// 求id最小值
		String hql5 = "select min(cust_id) from Customer ";
		Query query = session.createQuery(hql5);

		Number number = (Number) query.uniqueResult();

		System.out.println(number);
		// -------------------------
		tx.commit();
		session.close();

	}

	// 投影查詢
	@Test
	public void fun5() {
		Session session = HibnerateUtils.opensession();
		Transaction tx = session.beginTransaction();
		// --------------------------
		String hql="select cust_name from Customer";
		//擷取多個屬性[‘
		String hql2="select cust_name,cust_id from Customer";
		//下邊這個用到投影我們需要在相應實體類中添加如下的構造方法和空參構造方法。否則擷取不到
		String hql3="select new Customer(cust_id,cust_name) from Customer";
		Query query=session.createQuery(hql3);
		List list=query.list();
		System.out.println(list);
		//[百度, 黑馬, 360安全, 雅虎, 藍翔技工學院, 新東方, 傳智學院]
		// -------------------------
		tx.commit();
		session.close();

	}


}
           

三、查詢-Criteria文法

public class Demo3 {
	// 離線查詢
	//
	@Test
	public void fun1() {
		// web/service層
		DetachedCriteria d = DetachedCriteria.forClass(Customer.class);
		d.add(Restrictions.idEq(5l));

		Session session = HibnerateUtils.opensession();
		Transaction tx = session.beginTransaction();
		Criteria a = d.getExecutableCriteria(session);
		List<Customer> list = a.list();
		for (Customer l : list) {
			System.out.println(l.toString());

		}
		tx.commit();
		session.close();
	}

}
           

四、查詢優化

1.類級别查詢

session.get(Customer.class.5l);

get方法沒有任何政策,調用即立即查詢資料庫加載資料

load方法會應用類級别的加載政策,加載會受 .hbm.xml檔案下 <class name="com.hibernate.test.domain.Customer" table="CUSTOMER" lazy="true">

 lazy屬性的影響   

  lazy(預設值)true:擦汗尋時候會傳回代理對象。執行懶加載,此代理對象會在使用屬性時候,根據關聯的session對象查詢資料庫加載資料

  lazy:false   load方法會與get房沒有任何差別。調用時候立即加載。

  結論:為了提高效率,建議使用load方法進行延遲加載,(懶加載)

 注意:使用懶加載時候確定調用屬性加載資料時,session還是打開的。否則會抛出異常。org.hibernate.LazyInitializationException: could not initialize proxy - no Session

2.關聯界别查詢

集合政策

關聯屬性政策

結論:為了提高效率,fetch的選擇上應選擇select  lazy取值應選擇true。

繼續閱讀