Hibernate QBC 語言

 基本查詢 

如下是HQL/QBC/Native SQL三種查詢策略 
HQL策略: 

Java代碼 
java

session.createQuery("FROM Category c where c.name like 'Laptop%'");  
session.createQuery("FROM Category c where c.name like 'Laptop%'");



QBC策略: 

Java代碼 

sql

session.createCriteria(Category.class).add(Restrictions.like("name", "Laptop%"));  
session.createCriteria(Category.class).add(Restrictions.like("name", "Laptop%"));



Native SQL策略 

Java代碼 

session

session.createSQLQuery("select {c.*} from CATEGORY {c} where NAME like 'Laptop%'").   
addEntity("c",Category.class);  
session.createSQLQuery("select {c.*} from CATEGORY {c} where NAME like 'Laptop%'"). 
addEntity("c",Category.class);



分頁查詢 

Java代碼 
spa

Criteria criteria = session.createCriteria(Category.class)   
.add(Restrictions.like("name", "Laptop%"));   
criteria.addOrder(Order.asc("name"));   
criteria.setFirstResult(0);//初始行數   
criteria.setMaxResults(20);//每頁顯示行數  
Criteria criteria = session.createCriteria(Category.class) 
.add(Restrictions.like("name", "Laptop%")); 
criteria.addOrder(Order.asc("name")); 
criteria.setFirstResult(0);//初始行數 
criteria.setMaxResults(20);//每頁顯示行數



 數據過濾 

方法                      說明    
code

Restrictions.eq         =   
Restrictions.allEq      利用Map來進行多個等於的限制    
Restrictions.gt         >    
Restrictions.ge         >=    
Restrictions.lt         <  
Restrictions.le         <=    
Restrictions.between    BETWEEN   
Restrictions.like       LIKE   
Restrictions.in         in   
Restrictions.and        and   
Restrictions.or         or   
Restrictions.sqlRestriction     用SQL限定查詢


(a)    應用限制 

Java代碼 

對象

Criterion emailEq = Restrictions.eq("email", "w@163.com");   
Criteria criteria = session.createCriteria(User.class);   
criteria.add(emailEq);   
User user = (User)criteria.uniqueResult();  
Criterion emailEq = Restrictions.eq("email", "w@163.com"); 
Criteria criteria = session.createCriteria(User.class); 
criteria.add(emailEq); 
User user = (User)criteria.uniqueResult();



(b)    比較表達式 

Java代碼 

接口

Restrictions.between("amount", new BigDecimal(100), new BigDecimal(200));   
Restrictions.gt("amount", new BigDecimal(100));   
Restrictions.in("email", emails);//注:emails爲集合   
Restrictions.isNull("email");   
Restrictions.isNotNull("email");   
Restrictions.isEmpty("bids");   
Restrictions.sizeGe("bids", 3);//bids屬性大小  
Restrictions.between("amount", new BigDecimal(100), new BigDecimal(200)); 
Restrictions.gt("amount", new BigDecimal(100)); 
Restrictions.in("email", emails);//注:emails爲集合 
Restrictions.isNull("email"); 
Restrictions.isNotNull("email"); 
Restrictions.isEmpty("bids"); 
Restrictions.sizeGe("bids", 3);//bids屬性大小



(c)    字符串匹配 

Java代碼 

ip

Restrictions.like("email", "G%");   
Restrictions.like("email", "G%",MatchMode.START);


注:MatchMode分爲START,END,ANYWHERE,EXACT四種模式   
Restrictions.like("email", "G%").ignoreCase();  

Restrictions.like("email", "G%"); 
Restrictions.like("email", "G%",MatchMode.START); 
注:MatchMode分爲START,END,ANYWHERE,EXACT四種模式 
Restrictions.like("email", "G%").ignoreCase();  

(d)    組合表達式和邏輯操做符 

Java代碼 

ci

Restrictions.or(   
                Restrictions.and(   
                        Restrictions.like("firstname", "G%"),   
                        Restrictions.like("lastname", "K%")),   
                        Restrictions.in("email",emails));  
Restrictions.or( 
                Restrictions.and( 
                        Restrictions.like("firstname", "G%"), 
                        Restrictions.like("lastname", "K%")), 
                        Restrictions.in("email",emails));



(e)    SQL表達式 

Java代碼 

字符串

Restrictions.sqlRestriction("{alias}.name='tie' and {alias}.addr='dalian'");   
Restrictions.sqlRestriction("{alias}.name=?",  "tie", Hibernate.STRING);//姓名爲tie的對象   
Restrictions.sqlRestriction("length({alias}.PASSWORD) < ?",5,Hibernate.INTEGER);   
//密碼小於5個字符對象   
Restrictions.sqlRestriction("'100' >all( select b.AMOUNT FROM BID b " +   
                " WHERE b.ITEM_ID = {alias}.ITEM_ID)");//返回出價不大於100  
Restrictions.sqlRestriction("{alias}.name='tie' and {alias}.addr='dalian'"); 
Restrictions.sqlRestriction("{alias}.name=?",  "tie", Hibernate.STRING);//姓名爲tie的對象 
Restrictions.sqlRestriction("length({alias}.PASSWORD) < ?",5,Hibernate.INTEGER); 
//密碼小於5個字符對象 
Restrictions.sqlRestriction("'100' >all( select b.AMOUNT FROM BID b " + 
                " WHERE b.ITEM_ID = {alias}.ITEM_ID)");//返回出價不大於100




(f)    子查詢 

表關聯 

(a)    隱式關聯 
隱式關聯有兩種方法: 
一、    Criteria接口的createCriteria()方法: 

Java代碼 

session.createCriteria(Item.class)   
.add(Restrictions.like("description", "Foo",MatchMode.ANYWHERE))   
.createCriteria("bids")   
.add(Restrictions.gt("amount",new BigDecimal(100)));   
  
session.createCriteria(Item.class)   
            .createCriteria("seller")   
            .add(Restrictions.like("email", "%@"));  
session.createCriteria(Item.class) 
.add(Restrictions.like("description", "Foo",MatchMode.ANYWHERE)) 
.createCriteria("bids") 
.add(Restrictions.gt("amount",new BigDecimal(100))); 
session.createCriteria(Item.class) 
            .createCriteria("seller") 
            .add(Restrictions.like("email", "%@"));

二、    分配別名: 

Java代碼 

session.createCriteria(Item.class)   
            .createAlias("bids","b")   
            .add(Restrictions.like("description", "%Foo%"))   
            .add(Restrictions.gt("b.amount", new BigDecimal(100)));   
  
session.createCriteria(Item.class)   
            .createAlias("seller", "s")   
            .add(Restrictions.like("s.email","%@"));  
session.createCriteria(Item.class) 
            .createAlias("bids","b") 
            .add(Restrictions.like("description", "%Foo%")) 
            .add(Restrictions.gt("b.amount", new BigDecimal(100)));



session.createCriteria(Item.class) 
            .createAlias("seller", "s") 
            .add(Restrictions.like("s.email","%@"));  

(b)    抓取關聯 

Java代碼 

session.createCriteria(Item.class)   
            .setFetchMode("bids",FetchMode.JOIN)   
            .add(Restrictions.like("description", "%Foo%"))  
session.createCriteria(Item.class) 
            .setFetchMode("bids",FetchMode.JOIN) 
            .add(Restrictions.like("description", "%Foo%"))





投影/報表查詢 

(a)    簡單投影 

Java代碼 

session.createCriteria(Item.class)   
        .add(Restrictions.gt("endDate", new Date()))   
        .setProjection(Projections.id());//返回單一屬性   
  
session.createCriteria(Item.class).setProjection(   
Projections.projectionList().add(Projections.id()).   
add(Projections.property("description")));//返回一個Object[]  
session.createCriteria(Item.class) 
        .add(Restrictions.gt("endDate", new Date())) 
        .setProjection(Projections.id());//返回單一屬性 
session.createCriteria(Item.class).setProjection( 
Projections.projectionList().add(Projections.id()). 
add(Projections.property("description")));//返回一個Object[]

(b)    統計分組 

Java代碼 

session.createCriteria(Item.class)   
.setProjection(Projections.rowCount());   
  
session.createCriteria(Item.class)   
            .setProjection(Projections.projectionList()   
            .add(Projections.rowCount())   
            .add(Projections.sum("sales"))   
            .add(Projections.avg("score"))   
            );   
  
    session.createCriteria(Bid.class)   
        .createAlias("bidder", "u")   
        .setProjection(Projections.projectionList()   
                .add(Property.forName("u.id").group())   
                .add(Property.forName("u.username").group())   
                .add(Property.forName("id").count())   
                .add(Property.forName("amount").avg())   
            );  
session.createCriteria(Item.class) 
.setProjection(Projections.rowCount()); 
session.createCriteria(Item.class) 
            .setProjection(Projections.projectionList() 
            .add(Projections.rowCount()) 
            .add(Projections.sum("sales")) 
            .add(Projections.avg("score")) 
            ); 
    session.createCriteria(Bid.class) 
        .createAlias("bidder", "u") 
        .setProjection(Projections.projectionList() 
                .add(Property.forName("u.id").group()) 
                .add(Property.forName("u.username").group()) 
                .add(Property.forName("id").count()) 
                .add(Property.forName("amount").avg()) 
            );

(c)    SQL投影 

Java代碼 

String sqlFragment = "(select count(*) from Item i where i.item_id = item_id) "  
                + " as numofitems";   
        session.createCriteria(Bid.class).createAlias("bidder", "u")   
                .setProjection(   
                        Projections.projectionList().add(   
                                Projections.groupProperty("u.id")).add(   
                                Projections.groupProperty("u.username")).add(   
                                Projections.count("id")).add(   
                                Projections.avg("amount")).add(   
                                Projections.sqlProjection(sqlFragment,   
                                        new String[] { "numofitems" },   
                                        new Type[] { Hibernate.LONG }))   
  
                );
相關文章
相關標籤/搜索