1. get() and load()
session.get(Clazz, id); session.load(Clazz, id);
說明: load()與get()的區別 請注意如果沒有匹配的數據庫記錄,load()方法可能拋出無法恢復的異常(unrecoverable exception)。 如果類的映射使用了代理(proxy),load()方法會返回一個未初始化的代理,直到你調用該代理的某方法時才會去訪問數據庫。 若你希望在某對象中創建一個指向另一個對象的關聯,又不想在從數據庫中裝載該對象時同時裝載相關聯的那個對象,那么這種操作方式就用得上的了。 如果為相應類映射關系設置了batch-size, 那么使用這種操作方式允許多個對象被一批裝載(因為返回的是代理,無需從數據庫中抓取所有對象的數據)。 如果你不確定是否有匹配的行存在,應該使用get()方法,它會立刻訪問數據庫,如果沒有對應的行,會返回null。
2. HQL
// 返回一行記錄 String hql = "from TOrder o where o.id = ?"; TOrder o = (TOrder) s.createQuery(hql) .setParameter(0, orderId) .uniqueResult();
// 命名參數 Query q = sess.createQuery("from DomesticCat cat where cat.name = :name"); q.setString("name", "Fritz");
// 位置參數 Query q = sess.createQuery("from DomesticCat cat where cat.name = ?"); q.setString(0, "Izi");
// 命名參數列表 Query q = sess.createQuery("from DomesticCat cat where cat.name in (:namesList)"); q.setParameterList("namesList", names);
// 分頁查詢 Query q = sess.createQuery("from DomesticCat cat"); q.setFirstResult(20); q.setMaxResults(10); List cats = q.list();
3. Criteria
List cats = sess.createCriteria(Cat.class) .add( Restrictions.like("name", "Fritz%") ) .add( Restrictions.or( Restrictions.eq( "age", new Integer(0) ), Restrictions.isNull("age") ) ) .addOrder( Order.asc("name") ) .addOrder( Order.desc("age") ) .list();
4. Native SQL
String treeSql = "" + "select , level from tree t " + " start with t.parent_id = 0 " + " connect by prior t.id = t.parent_id";
List result = session.createSQLQuery(treeSql) .addEntity("t", Tree.class) .addScalar("level", Hibernate.INTEGER) .list();
5. Named SQL queries(不推薦)
6. filter(不推薦)
7. Detached queries(還沒測試) The DetachedCriteria class lets you create a query outside the scope of a session, and then later execute it using some arbitrary Session
|