Hibernate的查詢 標準(Criteria)查詢 – JAVA編程語言程序開發技術文章

一個簡單例子:
Java代碼 
@SuppressWarnings("unchecked") 
public void searchByPropertys() { 
    Session session = this.getSession(); 
    Criteria crit = session.createCriteria(Conft.class); 
    List<Conft> list = crit.list(); 
    for(Conft c : list){ 
        System.out.println(c.getId()); 
    } 

 
標準查詢API最終仍然翻譯為SQL交由數據庫處理,返回java.util.List對象
 
怎麼增加條件呢?請看如下代碼:
Java代碼 
public void searchByPropertys() { 
    Session session = this.getSession(); 
    Criteria crit = session.createCriteria(Conft.class);     
    crit.add(Restrictions.eq("id", 2)); // = 
    crit.add(Restrictions.ne("id", 2)); // != 
    crit.add(Restrictions.lt("id", 2)); // < 
    crit.add(Restrictions.gt("id", 2)); // > 
    crit.add(Restrictions.le("id", 2)); // <= 
    crit.add(Restrictions.ge("id", 2)); // >= 
    crit.add(Restrictions.in("id", new String[]{"2"})); // in 
    crit.add(Restrictions.like("id", "%2%")); // like 
    crit.add(Restrictions.like("id", "2",MatchMode.ANYWHERE)); // %x% 
    crit.add(Restrictions.like("id", "2",MatchMode.START)); // x% 
    crit.add(Restrictions.like("id", "2",MatchMode.END)); // %x 
    crit.add(Restrictions.like("id", "2",MatchMode.EXACT)); // x     
    List<Conft> list = crit.list(); 
    for(Conft c : list){ 
        System.out.println(c.getId()); 
    } 

 
代碼後面寫出瞭增加條件的方式和意思。
 
如果有and或者是or的關系的話,可以使用Conjunction(AND)和Disjunction(OR)!
下面是一個使用示例:
Java代碼 
public void searchByPropertys() { 
    Session session = this.getSession(); 
    Criteria crit = session.createCriteria(Conft.class); 
    // 創建條件 
    Criterion a = Restrictions.gt("id", 2); // > 
    Criterion b = Restrictions.lt("id", 2); // < 
    Criterion c = Restrictions.like("id", "2",MatchMode.ANYWHERE); 
    // and 關系 
    Conjunction conjunction = Restrictions.conjunction(); 
    conjunction.add(a); 
    conjunction.add(b); 
    // or 關系 
    Disjunction disjunction = Restrictions.disjunction(); 
    disjunction.add(conjunction); 
    disjunction.add(c);  
    // 增加查詢條件 
    crit.add(disjunction);   
    List<Conft> list = crit.list(); 
    for(Conft conft : list){ 
        System.out.println(conft.getId()); 
    } 

 
a和b是AND關系,而a和b合起來作為條件後和c是OR關系!
如果看他的SQL的話,是這樣的,有助於理解:
Java代碼 
(where (a>? and b<?) or c like ?) 
 
除此之外還可以使用sqlRestriction方法直接拼接SQL
Java代碼 
public User getUserById(int pk){ 
    Session session = this.getSession(); 
    Criteria crit = session.createCriteria(User.class); 
    crit.add(Restrictions.sqlRestriction(" {alias}.id=2 ")); 
    List<User> list = crit.list(); 
    return (User)list.get(0); 

 
註意{alias}是表的名稱,這個不用修改,Hibernate在生成SQL時會自動替換!
在源碼中可以看到:
Java代碼 
public static Criterion sqlRestriction(String sql, Object values[], Type types[]) 

    return new SQLCriterion(sql, values, types); 

public static Criterion sqlRestriction(String sql, Object value, Type type) 

    return new SQLCriterion(sql, new Object[] { 
        value 
    }, new Type[] { 
        type 
    }); 

public static Criterion sqlRestriction(String sql) 

    return new SQLCriterion(sql, ArrayHelper.EMPTY_OBJECT_ARRAY, ArrayHelper.EMPTY_TYPE_ARRAY); 

 
也就是說這個方法有三個調用方式,直接寫SQL,如果你的SQL中有 ? 作為占位符,那麼可設置後面兩個參數,第二個參數對應 ? ,第三個是參數字段的類型!
如果有多個 ? ,那麼第二和第三個參數就要用數組的形式來傳遞!

作者:dyllove98

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。