hibernate的檢索方式
1、導(dǎo)航對(duì)象檢索方式:根據(jù)已經(jīng)加載的對(duì)象導(dǎo)航到其他對(duì)象
Customer customer = session.get(Customer.class, 1);
customer.getOrders();//獲得客戶的訂單
2、OID檢索方式:按照對(duì)象的OID來(lái)檢索
get()/load():
3、HQL檢索方式:使用面向?qū)ο蟮腍QL語(yǔ)言
Query query = session.createQuery("HQL");
4、QBC檢索方式:使用QBC(Query by Criteria)API來(lái)檢索對(duì)象。這種API封裝了基于字符串形式的查詢語(yǔ)句,提供類更加面向?qū)ο蟮牟樵兘涌凇?/p>
Criteria criteria = session.createCriteria(Customer.class);
5、本地sql檢索方式:使用本地?cái)?shù)據(jù)庫(kù)的sql查詢語(yǔ)句
SQLQuery query = session.createSQLQuery("SQL")
HQL
查詢所有
public void queryAll(){
Session session = HBUtils.getSession();
Transaction transaction = session.beginTransaction();
Query query = session.createQuery("from Customer");
List<Customer> customers = query.list();
transaction.commit();session.close();
}
使用別名,并加參數(shù)(as可以省略)
public void queryAll(){
Session session = HBUtils.getSession();
Transaction transaction = session.beginTransaction();
Query query = session.createQuery("from Customer as c where id = ?").setInteger(0, 1);
List<Customer> customers = query.list();
transaction.commit();
session.close();
}
多態(tài)查詢(查詢繼承自某個(gè)類的所有對(duì)象)
public void queryAll(){
Session session = HBUtils.getSession();
Transaction transaction = session.beginTransaction();
List<Object> objects = session.createQuery("from java.lang.Object").list();
transaction.commit();
session.close();
}
排序
List<Customer> customers= session.createQuery("from Customer c order by c.id desc").list();
分頁(yè)查詢
List<Customer> customers= session.createQuery("from Customer").setFirstResult(0).setMaxResults(10).list();
獲取單個(gè)對(duì)象
Customer customer= (Customer) session.createQuery("from Customer where id = ?").setInteger(0, 1).uniqueResult();
參數(shù)綁定
?綁定
Customer customer= (Customer) session.createQuery("from Customer where id = ?").setInteger(0, 1).uniqueResult();
名稱綁定
Customer customer= (Customer) session.createQuery("from Customer where id = :id").setInteger("id", 1).uniqueResult();
投影查詢
List<String> names = session.createQuery("select c.name from Customer as c").list();
List<Object[]> objects = session.createQuery("select c.id, c.name from Customer as c").list();
List<Customer> customers = session.createQuery("select new Customer(c.id, c.name) from Customer as c").list();//這種方式的前提是必須有new Customer(c.id, c.name) 構(gòu)造函數(shù)
綁定實(shí)體
Customer customer = new Customer();
customer.setCid(1);
List<Order> orders = session.createQuery("from Order o where o.customer = ?").setEntity(0, customer).list();
模糊查詢
List<Customer> customers = session.createQuery("from Customer where name like ?").setParameter(0, "小%").list();
內(nèi)鏈接
List<Customer> customers = session.createQuery("from Customer c inner join c.orders").list();
迫切內(nèi)鏈接
List<Customer> customers = session.createQuery("from Customer c inner join fetch c.orders").list();
內(nèi)鏈接和迫切內(nèi)鏈接的區(qū)別:
內(nèi)鏈接:將數(shù)據(jù)封裝到一個(gè)List<Object[]>中
迫切內(nèi)鏈接:將數(shù)據(jù)封裝到一個(gè)List<Customer>中,,并且迫切內(nèi)鏈接會(huì)有重復(fù)的記錄,需要使用distinct去重。
QBC
查詢所有
public void queryAll(){
Session session = HBUtils.getSession();
Transaction transaction = session.beginTransaction();
Criteria criteria = session.createCriteria(Customer.class);
List<Customer> customers = criteria.list();
transaction.commit();session.close();
}
排序
List<Customer> customers= session.createCriteria(Customer.class).addOrder(org.hibernate.criterion.Order.desc("cid")).list();
分頁(yè)查詢
List<Customer> customers= session.createCriteria(Customer.class).setFirstResult(0).setMaxResults(10).list();
獲取單個(gè)對(duì)象
Customer customer= (Customer) session.createCriteria(Customer.class).add(Restrictions.eq("id", 1)).uniqueResult();
模糊查詢
Customer customer= (Customer) session.createCriteria(Customer.class).add(Restrictions.like("name", "小%")).list();
離線的條件查詢
DetachedCriteria criteria = DetachedCriteria.forClass(Customer.class);
criteria.add(Restrictions.eq("", ""));
Criteria c = criteria.getExecutableCriteria(session);
List<Customer> customers = c.list();




SQL
查詢所有
public void queryAll(){
Session session = HBUtils.getSession();
Transaction transaction = session.beginTransaction();
// List<Object[]> customers = session.createSQLQuery("select * from customer").list();
List<Customer> customers = session.createSQLQuery("select * from customer").addEntity(Customer.class).list();
transaction.commit();
session.close();
}
延遲檢索
get()/load()
延遲檢索失效:
1、檢索的對(duì)象用filan修飾,此時(shí)不能生成代理對(duì)象
2、將映射文件中的class標(biāo)簽的的lazy屬性改為false。
類級(jí)別的檢索和關(guān)聯(lián)級(jí)別的檢索
類級(jí)別的檢索:在<class>上配置lazy
關(guān)聯(lián)級(jí)別的檢索:在<set>/<many-to-one>上設(shè)置lazy
從一的一方關(guān)聯(lián)多的一方,在<set>上進(jìn)行配置
fetch:控制sql語(yǔ)句的類型
join:發(fā)送迫切左外鏈接
select:默認(rèn)值
subselect:發(fā)送子查詢語(yǔ)句,查詢關(guān)聯(lián)對(duì)象。如果查詢一個(gè)則會(huì)使用“=”,如果多個(gè),則發(fā)送子查詢,使用“in”
lazy:控制關(guān)系對(duì)象的檢索是否采用延遲
true:默認(rèn)值:使用延遲檢索
false:不使用延遲檢索
extra:及其懶惰,使用什么信息,就發(fā)送什么sql
如果fetch是join的情況,lazy屬性將會(huì)被忽略
在多的一方關(guān)聯(lián)一的一方,在<many-to-one>上進(jìn)行配置
fetch
join:發(fā)送迫切左外鏈接,fatch=join,lazy屬性將會(huì)被忽略
select:發(fā)送多條sql檢索關(guān)聯(lián)對(duì)象
lazy
false:不延遲
proxy:使用代理。檢索訂單的時(shí)候,是否馬上檢索客戶,有customer對(duì)象的映射文件中<class>上的lazy屬性決定。
no-proxy:不使用代理
批量抓取
抓取客戶的訂單:在客戶的<set>集合上配置batch-size = "3",即一次抓取三條。
抓取訂單的客戶:在客戶的<class>標(biāo)簽上配置batch-size
事物隔離
在核心配置文件中配置。
<property name = "hibernate.connection.isolation">4</property>
1-Read uncommitted isolation(最低)
2-Read committed isolation
3-Repeattable read isolation
4-Serializable isolation(最高)
線程綁定session
在hibernate核心配置文件中配置
<property name = "hibernate.current_session_context_class">thread</property>
使用Sessionactory中的getCurrentSession方法
底層就是ThreadLocal
當(dāng)前線程中的session不需要關(guān)閉,線程結(jié)束就會(huì)自動(dòng)關(guān)閉