QBC (Query By Criteria)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/luckily_star/article/details/80664659

Criteria  通用规则

Criterrion   部分规则  自定义

Restrictions 限制条件

Projection 投影(返回Object数组)

运算符号
= eq
!=ne
>gt
<lt
>=ge
<=le
in
is null
is not null



查询所有

 @Test
    public  void  queryAll(){
        Criteria criteria=s.createCriteria(Product.class);
   //     Criteria criteria=s.createCriteria("com.oracle.entity.Product");//方法2
        List<Product> list=criteria.list();
        for (Product p:list){
            System.out.println(p.getPname());
        }
    }

分页

criteria.setFirstResult(0);
criteria.setMaxResult(3);

@Test
    public void queryByPage(){
        Criteria criteria=session.createCriteria(Product.class);
        criteria.setFirstResult(0);
        criteria.setMaxResults(3);

        List<Product> list=criteria.list();
        for (Product p:list){
            System.out.println(p.getPname());
        }
    }

排序

criteria.add(Restrictions.gt("属性",条件))

排序
criteria.addOrder(Order.desc("属性"));

 @Test
    public void queryAll3(){
        Criteria criteria=session.createCriteria(Product.class);
        criteria.addOrder(Order.desc("salecount"));//paixu
        criteria.addOrder(Order.asc("collect"));

        /**
        *多个条件排序
        **/
         SimpleExpression expression1= Restrictions.lt("salecount",7l);//<  属性  条件
        SimpleExpression expression2=Restrictions.gt("collect",5l);//>  
        criteria.add(Restrictions.and(expression1,expression2));
        criteria.setFirstResult(0);
        criteria.setMaxResults(3);


        List<Product> list = criteria.list();
        for (Product p:list){
            System.out.println(p.getPname());
            System.out.println(p.getSalecount());
            System.out.println(p.getCollect());
        }
    }

多个条件排序

规则:二次排序 先按第一个条件进行排序 如果第一次没有相同的数据 第二个条件不起作用;如果第一次有相同的数据 第二次只排重复的按第二个条件进行排序



模糊查询

criteria.add(Restrictions.like("属性","%条件%"))

 @Test
    public void queryByLike(){
        Criteria criteria=session.createCriteria(Product.class);
        criteria.addOrder(Order.desc("salecount"));//排序
        criteria.addOrder(Order.asc("collect"));
        criteria.add(Restrictions.like("pname","%小米%"));
        List<Product> list=criteria.list();
        for (Product p:list){
            System.out.println(p.getPname());
            System.out.println(p.getCollect());
            System.out.println(p.getSalecount());
        }
    }


投影查询

@Test
    public void queryAllByProject(){
        Criteria criteria=session.createCriteria(Product.class);
        criteria.addOrder(Order.desc("salecount"));
        criteria.addOrder(Order.asc("collect"));
        ProjectionList projectionList = Projections.projectionList();
        projectionList.add(Projections.property("pname"));
        projectionList.add(Projections.property("salecount"));
        projectionList.add(Projections.property("collect"));

        criteria.setProjection(projectionList);
        List<Object[]> list=criteria.list();
        for (Object[] o:list){
            System.out.println(o[0]);
            System.out.println(o[1]);
            System.out.println(o[2]);
        }
    }

分组查询      不支持having

Projections.groupProperty("属性")

 /**
     * 分组=合并 把相同的数据合并为一条 一个字段 多个字段来分组
     * SELECT  SALECOUNT,USID,count(SALECOUNT) FROM TPRODUCT GROUP BY SALECOUNT,USID
     * 在QBC中不支持having 查询 自己通过java代码去过滤
     */
    @Test
    public void queryAllByGroup(){
        Criteria criteria=s.createCriteria(Product.class);

        ProjectionList projectionList=Projections.projectionList();
        //分类
        projectionList.add(Projections.groupProperty("salecount"));
        //对象
        projectionList.add(Projections.groupProperty("user"));
        projectionList.add(Projections.count("salecount"));
        criteria.setProjection(projectionList);
        List<Object[]> list=criteria.list();
        for (Object[] o:list){
            System.out.println(o[0]);
            System.out.println(((User)o[1]).getPk());
            System.out.println(o[2]);
        }
    }

多表查询

Criteria criteria=s.createCriteria(类名.class);

左外连接
criteria.createCriteria("想要连接的类名",JoinType.LEFT_OUTER_JOIN);


/**
     * SELECT T.*,C.CNAME FROM TPRODUCT T LEFT JOIN TCATALOG C ON T.CID=C.PK
     * 左连接
     */
    @Test
    public void queryallbyleftjoin(){
        Criteria criteria = s.createCriteria(Product.class);
        criteria.createCriteria("catalog", JoinType.LEFT_OUTER_JOIN);
        List<Product> list=criteria.list();
        for (Product p:list){
            System.out.println(p.getPname());
            System.out.println(p.getCatalog().getCname());
        }

    }
内连接

criteria.createCriteria("想要连接的类名",JoinType.INNER_JOIN);

 /**
     * SELECT T.*,C.CNAME FROM TPRODUCT T LEFT JOIN TCATALOG C ON T.CID=C.PK
     * 一般来说 开发的是hibernate  连接查询没有意义 类和类本身存在关联关系
     * 查询 Fetch的规则 抓取策略 去查询 即时加载 (一条多表查询的sql) 懒加载(只发一条sql)
     */
    @Test
    public void queryallbyinnerjoin(){
        Criteria criteria = s.createCriteria(Product.class);
        criteria.createCriteria("catalog", JoinType.INNER_JOIN);
        List<Product> list=criteria.list();
        for (Product p:list){
            System.out.println(p.getPname());
            System.out.println(p.getCatalog().getCname());
        }

    }









猜你喜欢

转载自blog.csdn.net/luckily_star/article/details/80664659
QBC
今日推荐