隨筆-8  評論-0  文章-1  trackbacks-0
          最近項目用上了條件查詢,參考了Hibernate文檔,整理出一份筆記

          創(chuàng)建條件查詢實例

          1Criteria criteria = session.createCriteria(User.class);

          限制結(jié)果集
          org.hibernate.criterion.Restrictions類 定義獲得某些內(nèi)置Criterion類型的工廠方法

          criteria.add(Restrictions.eq("username""yanshi"));
          //輸出yanshi 1
             //         yanshi 2

          Restrictions.and()邏輯與
          criteria.add(Restrictions.and(Restrictions.like("username""y%"),Restrictions.ne("id"1)));
          /*
          yanshi2
          7
          yanshi3
          8
          yanshi
          9
          */

          Restrictions.conjunction()也是邏輯與,但是和and區(qū)別一直不太清楚,GOOGLE了一下也沒找到明確的說法,最后看了下生成的SQL,個人理解應(yīng)該是添加一個查詢集合,按文檔叫法就是邏輯分組
           1//criteria.add(Restrictions.like("username", "y%")).add(Restrictions.conjunction().add(Restrictions.ne("id", 1)));
           2
           3Hibernate: 
           4    select
           5        this_.id as id1_0_,
           6        this_.role as role1_0_,
           7        this_.username as username1_0_,
           8        this_.password as password1_0_ 
           9    from
          10        test.user this_ 
          11    where
          12        this_.username like ? 
          13        and (
          14            this_.id<>?
          15        ) limit ?
          16
          17//criteria.add(Restrictions.like("username", "y%")).add(Restrictions.conjunction().add(Restrictions.ne("id", 1)));
          18
          19Hibernate: 
          20    select
          21        this_.id as id1_0_,
          22        this_.role as role1_0_,
          23        this_.username as username1_0_,
          24        this_.password as password1_0_ 
          25    from
          26        test.user this_ 
          27    where
          28        (
          29            this_.username like ? 
          30            and this_.id<>?
          31        ) limit ?
          32
          33

          Restrictions.or()邏輯或
          criteria.add(Restrictions.or(Restrictions.like("username""y%"),Restrictions.eq("id",1)));
          /*yanshi
          1
          yanshi2
          2
          yanshi3
          2
          yanshi
          */

          同樣Restrictions.disjunction()也是添加一個or查詢集合
           1//criteria.add(Restrictions.like("username", "y%")).add(Restrictions.disjunction().add(Restrictions.ne("id", 1)).add(Restrictions.in("username",new String[]{"yanshi","yanshi1"})).add(Restrictions.like("username", "yanshi")));
           2
           3
           4Hibernate: 
           5    select
           6        this_.id as id1_0_,
           7        this_.role as role1_0_,
           8        this_.username as username1_0_,
           9        this_.password as password1_0_ 
          10    from
          11        test.user this_ 
          12    where
          13        this_.username like ? 
          14        and (
          15            this_.id<>
          16            or this_.username in (
          17                ?, ?
          18            ) 
          19            or this_.username like ?
          20        ) limit ?


          Restrictions.in() 參數(shù)位于列表中的值

          criteria.add(Restrictions.in("id",new Integer[]{1,2,3}));
          /*
          yanshi
          1
          stone1
          2
          stone
          3
          */


          Restrictions.between() value1~value2之間包括本身任意值

          criteria.add(Restrictions.between("id", 1, 3));
          /*
          yanshi
          1
          stone1
          2
          stone
          3
          */


          Restrictions.not() 邏輯非,可以和其他條件組合

          criteria.add(Restrictions.not(Restrictions.eq("id",1)));

          criteria.add(Restrictions.not(Restrictions.between("id", 1, 3)));

          criteria.add(Restrictions.not(Restrictions.in("id",new Integer[]{1,2,3})));

          Restrictions最有意思的功能就是可以直接使用SQL

          Restrictions.sqlRestriction()
          criteria.add(Restrictions.like("username""yan%")).add(Restrictions.sqlRestriction("{alias}.id=?",1,Hibernate.INTEGER));

          //yanshi 1

          如果有多個參數(shù),可以傳入一個數(shù)組
          Integer[] agrs=new Integer[]{1,2};
                  Type[] types
          =new Type[]{Hibernate.INTEGER,Hibernate.INTEGER};
                  criteria.add(Restrictions.like(
          "username""yan%")).add(Restrictions.sqlRestriction("{alias}.id=? or {alias}.id=?",agrs,types));

          /*
          yanshi
          1
          stone1
          2
          */


          其他

          Restrictions.eq() Restrictions.ne() 等于,不等于

          Restrictions.gt()  Restrictions.ge() 大于,大于或等于

          Restrictions.lt()   Restrictions.le()  小于,小于或等于

          Restrictions.isnull() Restrictions.isNotnull() 等于空,不等于空

          Restrictions.like()  匹配字符串

          同樣的屬性使用多次時候,寫Restrictions嫌麻煩,可以用Property

          1Property username=Property.forName("username");
          2criteria.add(username.like("yansh%"));


          關(guān)聯(lián)

          關(guān)聯(lián)有兩種方式
          createCriteria()和crerateAlias()
          區(qū)別是前一個創(chuàng)建實力,后一個不創(chuàng)建

          createCriteria()

          1criteria.add(Restrictions.like("username""yan%")).createCriteria("role").add(Restrictions.eq("type","管理員"));


          crerateAlias()

          criteria.add(Restrictions.like("username""yan%")).createAlias("role","r").add(Restrictions.eq("r.type""管理員"));


          crerateAlias() 適用于這樣的情況,比如表A 關(guān)聯(lián)表B 和C 需要查詢出B.name 等于C.name 的表A的數(shù)據(jù)

          1criteria.createAlias("BTABLE""b").createAlias("CTABLE""c").add(Restrictions.eqProperty("b.name""c.name"));


          如果想獲得管理對象的數(shù)據(jù)使用ResultTransformer

           1List list=criteria.createAlias("role","r").add(Restrictions.like("username""yans%"));
           2
           3criteria.setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP);
           4
           5Iterator iter=list.iterator();
           6        while(iter.hasNext()){
           7            Map map=(Map) iter.next();
           8            User u=(User) map.get(Criteria.ROOT_ALIAS);
           9            System.out.println(u.getUsername()+"aaaa");
          10            Role r=(Role) map.get("r");
          11            System.out.println(r.getType()+"bbbb");
          12        }

          13
          14/*
          15yanshiaaaa
          16管理員bbbb
          17yanshi2aaaa
          18普通用戶bbbb
          19yanshi3aaaa
          20普通用戶bbbb
          21yanshiaaaa
          22普通用戶bbbb
          23
          24*/

           

          關(guān)聯(lián)抓取

          Criteria criteria = session.createCriteria(User.class).setFetchMode("role", FetchMode.SELECT);

          如果多個關(guān)聯(lián)可以用

          Criteria criteria = session.createCriteria(User.class).setFetchMode("role", FetchMode.JOIN).setFetchMode("role.xxx",FetchMode.JOIN);


           FetchMode.JOIN 和 FetchMode.SELECT 前一個是采用連接解決N+1的問題,SELECT產(chǎn)生大量查詢語句........產(chǎn)生N+1 問題

          查詢示例

          1User user = new User();
          2Role role = new Role();
          3//role.setId(1);
          4role.setType("管理員");
          5user.setRole(role);
          6criteria.add(Example.create(user));
          7
          8//可以使用關(guān)聯(lián),但是貌似用ID作為條件沒有效果
          9criteria.add(Example.create(user)).createCriteria("role").add(Example.create(user.getRole()));

          enableLike()
          對于字符串可以設(shè)置匹配模式
          1Example.create(user).enableLike(MatchMode.ANYWHERE)
          MatchMode.ANYWHERE 任何位置
          MacthMode.END 匹配結(jié)尾
          MacthMode.START 匹配開頭
          MatchMode.EXACT 精確匹配

          其他的一些設(shè)置
          excludeNone() 忽略NULL
          excludeZeroes()忽略0
          excludeProperty("屬性名") 忽略指定屬性

          投影
          Projections可以進(jìn)行一些運(yùn)算操作

          Projections.avg(propertyName)統(tǒng)計指定屬性平均數(shù)
          Projections.count(propertyName)統(tǒng)計指定屬性的行數(shù)
          Projections.max(propertyName) 最大值
          Projections.min(propertyName) 最小值

          1int totalCount = new Integer(criteria.setProjection(Projections.rowCount()).uniqueResult().toString());
          2criteria.setProjection(null);
          3criteria.setFirstResult(first);
          4criteria.setMaxResults(max);
          5criteria.setResultTransform(Criteria.ROOT_ENTITY);

          注意 一定要在OrderBy和setFirstResult setMaxResults 之前使用不然返回空,最后還要設(shè)置返回類型,不然默認(rèn)為Object

          Projections.distinct()用來處理重復(fù)數(shù)據(jù)
           1public List<User> list(int first, int max) {
           2        Session session = new Configuration().configure().buildSessionFactory()
           3                .openSession();
           4        Criteria criteria = session.createCriteria(User.class).setFetchMode("role", FetchMode.JOIN);
           5        //取得ID值
           6        criteria.setProjection(Projections.distinct(Projections.projectionList().add(Projections.groupProperty("password")).add(Projections.id())));
           7        List ids=new ArrayList<Integer>();
           8        for (Iterator iter = criteria.list().iterator(); iter.hasNext();) {   
           9           Object[] values = (Object[]) iter.next();   
          10           ids.add((Integer)values[1]);
          11        }
            
          12        //用in來查詢數(shù)據(jù)
          13        criteria.add(Restrictions.in("id",ids));
          14        int totalCount = new Integer(criteria.setProjection(
          15                Projections.rowCount()).uniqueResult().toString());
          16        criteria.setProjection(null);
          17        criteria.setFirstResult(first);
          18        criteria.setMaxResults(max);
          19        criteria.setResultTransformer(Criteria.ROOT_ENTITY);
          20        List<User> list = criteria.list();
          21        return list;
          22    }


          需要說明的是
          1criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);

          也是出來重復(fù)數(shù)據(jù)的,但是該方法是在結(jié)果集中處理,對分頁影響比較大,比如實際上查詢出10條數(shù)據(jù),重復(fù)2條,重復(fù)處理后實際顯示9條數(shù)據(jù),這樣和分頁的總數(shù)就不一致了

          投影可以設(shè)置別名供其他投影使用
          1criteria.setProjection(Projections.groupProperty("username").as("name")).addOrder(Order.desc("name"))

          同樣可以Property.forName來設(shè)置投影

          在SESSION創(chuàng)建查詢使用DetachedCriteria

          1DetachedCriteria c=DetachedCriteria.forClass(User.class);





          posted on 2009-12-21 23:13 巖石 閱讀(483) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 尚义县| 华阴市| 浮山县| 二手房| 涿鹿县| 遂平县| 南汇区| 贺州市| 甘孜县| 长武县| 宜川县| 辛集市| 仙居县| 扬中市| 广饶县| 丹东市| 枣庄市| 鸡西市| 平谷区| 万山特区| 麻江县| 许昌县| 临西县| 富民县| 东辽县| 兰州市| 文成县| 白朗县| 仪征市| 三原县| 浑源县| 永定县| 福泉市| 武清区| 蛟河市| 星子县| 新建县| 江山市| 大洼县| 富锦市| 达拉特旗|