hibernate.的QBC語句

火星人 @ 2014-03-09 , reply:0


  1. Criteria相關介紹

  Criteria叫標準化條件查詢,是比HQL更面向對象的查詢語句.稱為QBC(Query By Criteria)

  Criteria介面:代表一個查詢.它是一個查詢條件的容器,通過add()方法向其實例中添加查詢條件.

  Criterion介面:代表一種面向對象的查詢條件.它的實例是作為Criteria介面add()方法的參數添加到Criteria實例中的.

  Restrictions類:是用來創建查詢條件Criterion實例的工具類,它提供了一系列的靜態方法用來設定查詢條件並作為Criterion實例返回.

  2. 具體實現步驟

  //1.創建Criteria查詢語句

  Criteria criteria = session.createCriteria(Employee.class);

  //2.給查詢出來的語句設定查詢條件

  Criterion criterion1 = Restrictions.ge("salary", new Double(4000.00));

  Criterion criterion2 = Restrictions.like("loginName", "z%");

  //3.把查詢條件放到Criteria語句

  criteria.add(criterion1);

  criteria.add(criterion2);

  //排序,可寫可不寫

  criteria.addOrder(Order.desc("id"));

  List<Employee> list = criteria.list();

  3.動態查詢

  在編程時無法確定要查詢的欄位.即用戶在在網頁上面自由選擇某些查詢條件,程序根據用戶的選擇條件,動態生成SQL語句進行查詢.

  例子:(比如某些網站的高級查詢)

  //StudentDAOImpl.java

  public List findStudents(String name,String classes){

  Criteria crit=session.createCriteria(Student.class);

  if(name!=null&&name!=""){ //如果填寫了名字,添加查詢名字的條件

  crit.add(Restrictions.like("name",name));

  }

  If(classes!=null&&classes!=""}{

  crit.add(Restrictions.eq("classes",classes));

  }

  Crit.addOrder(Order.asc("name");

  return crit.list();

  4. 離線查詢

  DetachedCriteria類支持離線查詢.所謂離線查詢就是指一個Session範圍之外創建好一個查詢,然後在需要使用時再附加到一個Session實例上來執行它.

  對於分層的web應用程序來說,web層需要傳遞一個查詢條件列表給業務邏輯層,業務層對象獲得這個條件后依次取出條件值,然後拼裝出SQL查詢語句.這裡的一個難點是如何將用戶的多項查詢條件傳入業務邏輯層.

  Criteria與session是綁定的.在web層,使用DetachedCriteria來構造查詢條件,然後將這個DetachedCriteria作為方法調用參數傳遞給業務邏輯層對象.而業務層對象獲得DetachedCriteria之後,可以在session範圍內直接構造Criteria,進行查詢.這樣,查詢語句的構造脫離了session範圍,完全被移植到web層實現.

  例子:

  //StudentDAO.java

  public List findStudents(DetachedCriteria detchedCriteria){

  List list=null;

  //打開session,開啟事務

  Criteria Criteria=detachedCriteria.getExecutableCriteria(session);

  list=criteria.list();

  //提交事務,關閉session

  return list;

  }

  DetachedCriteria detchedCriteria=DetachedCriteria.forClass(Student.class);

  String name="獲取名字";

  String age="獲取班級";

  if(name!=null&&name!=""){ //如果填寫了名字,添加查詢名字的條件

  detchedCriteria.add(Restrictions.like("name",name));

  }

  If(classes!=null&&classes!=""}{ detchedCriteria.add(Restrictions.eq("classes",classes));

  }

  detchedCriteria.addOrder(Order.asc("name");

  List list=StudentDAO.findStudents(detchedCriteria);

  for(){…}

  5. 示例查詢(QBE)

  根據一個給定的實例類實例來構建一個條件查詢的方式.先創建一個對象樣板,然後檢索出所有和這個樣板相同的對象.在查詢表單中填寫的項,可以封裝成一個對象,這就是對象樣板.

  public static void testQBE(Employee employee){

  //開啟事務

  //根據傳入的employee實例來創建查詢條件

  Example example = Example.create(employee)

  .excludeZeroes() //排除0值的屬性

  .excludeProperty("color") //排除指定的屬性

  .ignoreCase() //對所有的字元串類型的屬性值忽略大小寫比較

  .enableLike(); //對所有的字元串類型的屬性值使用like比較

  List<Employee> results = session.createCriteria(Employee.class)

  .add(example) .list();

  for (Employee empl : results) {

  System.out.println(empl.getLoginName() "," empl.getSalary()); }

  //提交事務 //關閉Session }

  Employee empl=new Employee();

  empl.setLonginName("%z%");

  testQBE(empl);

  6. Native SQL Queries

  原生SQL查詢:就是指直接使用標準SQL語句或特定資料庫的SQL進行查詢.對原生SQL查詢執行的控制是通過SQLQuery介面進行的,通過Session上調用createSQLQuery()來獲取這個介面.

  1).實體查詢

  Hibernate執行原生SQL查詢后,自動把查詢到的表格式的數據集封裝到實體對象中.

  2). 標量查詢

  3).定義成命名查詢來使用

  7. 小結

  HQL功能最強大,適合各種情況,但動態查詢構造起來不方便;Criteria最適合動態條件查詢,不太適合統計查詢;QBE還不夠強大,只適合相當簡單的查詢;NativeSQL可以實現特定資料庫的SQL,但可移植不好.

  針對Web應用來說,動態查詢,首先Criteria,但是涉及統計查詢和非常複雜的關聯查詢,Criteria就無能為力了,這種情況下選擇HQL.HQL常用來進行實體檢索,要注意返回的list中的元素是實體還是實體數組QBC 不會忽略配置文件中的預先抓取策略.




[火星人 via ] hibernate.的QBC語句已經有118次圍觀

http://www.coctec.com/docs/java/show-post-59773.html