zoukankan      html  css  js  c++  java
  • Hibernate查询之API查询

    Hibernate在检索数据上,可以使用SQL、HQL和官方API进行查询,本人主要利用API进行相关查询的小demo。

    话不多少直接上demo。

    demo1:基本查询

        /**
         * 默认不加任何条件的时候是搜索全部。()
         * @param session
         */
        private static void demo1(Session session) {
            //criteria 是条件的意思
            Criteria criteria = session.createCriteria(StuInfo.class, "stu");
            //idEq()是根据id进行匹配,gt()大于,lt()小于,in()在其中...
            criteria.add(Restrictions.idEq(4));
            List<StuInfo> infos = criteria.list();
            for (StuInfo stuInfo : infos) {
                System.out.println(stuInfo);
            }
        }

    说明:

     1.关键需要掌握Restrictions的几个方法 eq,lt,gt... ,此类似于jQuery。

    demo2:模糊查询

        /**
         * 模糊查询
         * notice:普通的大于小于等的查询使用的是条件Restrictions
         * @param session
         */
        private static void demo2(Session session) {
            Criteria criteria = session.createCriteria(StuInfo.class, "stu");
            criteria.add(Restrictions.like("stuName", "%刘%"));
            List<StuInfo> list = criteria.list();
            System.out.println(list.size());
        }

    说明:

     1.模糊查询使用like,使用%作为模糊条件。

     2.直接使用HQL的模糊查询是在设置参数的时候进行拼接的,使用API不许如此,使用HQL的查询总结如下。

    String hql = "From StudentEntity as s where s.id= ? or s.stuName like ?";
    List<StudentEntity> lists = getSession().createQuery(hql).setString(0, "%" + param + "%").setString(1, "%" + param + "%").list();

    demo3:基本查询

    /**
         * 关联查询
         * notice:利用createAlias来新建关联,翻译成SQL就是inner join,需要注意的是session中对应的那个类需要有一个字段叫做被关联的名称。
         * ps:实现原理是这样的:被关联的类的id作为外键ID,然后根据实体类的映射关系找到当前实体类的外键字段。
         * @param session
         */
        private static void demo4(Session session) {
            Criteria criteria = session.createCriteria(StuInfo.class, "stu");
            // 词句代码是关键:表示引入stuClass这个类。notice:stuClass此字段必须存在在StuInfo这个类中。
            criteria.createAlias("stuClass", "cls");
            criteria.add(Restrictions.eq("cls.classId", 1)).add(Restrictions.gt("stu.stuId", 70));
            List<StuInfo> lists = criteria.list();
            for (StuInfo stuInfo : lists) {
                System.out.println(stuInfo);
            }
        }

    说明:

     1.关联查询是API查询的最大优点之一,只要"主类"中有对应的外键类的参数,那么就可以通过  createAlias(外键对象名,别名) 进行关联。

     2.其内部使用的是 outer join 通过主类中外键对象的id相同进行关联的。

    demo4:排序

        /**
         * 排序
         * Order.desc("propertyName")  或者  Order.asc("propertyName")
         * @param session
         */
        private static void demo5(Session session) {
            Criteria criteria = session.createCriteria(StuInfo.class, "stu");
            criteria.add(Restrictions.gt("stu.stuId", 30));
         //addOrder()方法排序,通过Order.asc(id)或者Order.desc(id)进行相应排序
            criteria.addOrder(Order.desc("stu.stuId"));
            List<StuInfo> list = criteria.list();
            for (StuInfo stuInfo : list) {
                System.out.println(stuInfo);
            }
        }

    说明:

    1. 见绿色注释

    demo5:条件OR查询

        /**
         * or
         * Restrictions.or(ex1,ex2,ex3);均表示的是多个条件依次or
         * @param session
         */
        private static void demo6(Session session) {
            Criteria criteria = session.createCriteria(StuInfo.class, "stu");
         //or(条件1,条件2,...)不同的or条件通过逗号进行分割
            criteria.add(Restrictions.or(Restrictions.gt("stu.stuId", 20), Restrictions.lt("stu.stuId", 70)));
            List<StuInfo> list = criteria.list();
            for (StuInfo stuInfo : list) {
                System.out.println(stuInfo);
            }
        }

     

    demo6:聚合函数1

    /**
         * or
         * Restrictions.or(ex1,ex2,ex3);均表示的是多个条件依次or
         * @param session
         */
        private static void demo7(Session session) {
            Criteria criteria = session.createCriteria(StuInfo.class, "stu");
            //notic:Restriction就是普通的条件直接add就可以了
            criteria.add(Restrictions.or(Restrictions.gt("stu.stuId", 20), Restrictions.lt("stu.stuId", 70)));
            //notice:Projection在设置的使用需要使用setProjection
            criteria.setProjection(Projections.projectionList().add(Projections.avg("stuId")).add(Projections.rowCount()));
            
            List<StuInfo> list = criteria.list();
            for (StuInfo stuInfo : list) {
                System.out.println(stuInfo);
            }
        }

     说明:

     1. 普通的基本条件使用的是Restriction,但是聚合函数使用的是Projection。

     2. 聚合函数在添加条件的时候,需要使用criteria.setProjection(Projections.projectionList().add(xxx).add(xxx))进行处理。

     

    demo7:聚合函数之别名排序

    /**
         * Projection作为同Restriction的一个条件,用在"聚合函数"和"投影"上
         * 两种办法:一种是利用as,一种是利用逗号分隔。
         * 
         * @param session
         */
        private static void demo8(Session session) {
            Criteria criteria = session.createCriteria(StuInfo.class, "stu");
            //对于普通的条件Restriction相关的就是直接add,但是对于Projections若要链式添加,需要使用  Projections.projectionList().add().add()
            criteria.setProjection(Projections.projectionList().add(Projections.rowCount())
                    .add(Projections.max("stu.stuId").as("max"))
                    .add(Projections.alias(Projections.min("stu.stuId"), "min"))
                    .add(Projections.groupProperty("stu.stuClass")));
            criteria.addOrder(Order.desc("min"));
            //需要注意的是使用投影后的返回值,本人觉得使用List<Object[]>最方便
            List<Object[]> list = criteria.list();
            for (Object[] object : list) {
                System.out.println(object);
            }
        }

     说明:

     1. 聚合函数上可以通过.as 或者 alias()设置别名,方便后续的排序操作。

    demo8:投影

        /**
         * 投影
         * notice:只需要部分数据的使用,使用 Project.property("xxx")
         * @param session
         */
        private static void demo10(Session session) {
            Criteria criteria=session.createCriteria(StuInfo.class,"stu");
         //关键代码,通过上述提到的 setProjection(Projections.projectionList().(add(选取的列).as("别名")).add((选取的列),"别名"))
            criteria.setProjection(Projections.projectionList().add(Projections.property("stuId").as("id"))
                    .add(Projections.property("stuName"),"name")).addOrder(Order.desc("id")).addOrder(Order.asc("name"));
            List<Object[]> item=criteria.list();
            for (Object[] objects : item) {
                System.out.println("stuName:"+objects[1]+" stuId:"+objects[0]);
            }
        }

    说明:

    1. 通过上述提到的 setProjection(Projections.projectionList().(add(选取的列).as("别名")).add((选取的列),"别名")) 进行相应操作。

    demo9:分页

    /**
         * 分页
         * 
         * @param session 
         * @param pageSize 每页容量
         * @param pageNo  页码
         */
        private static void demo12(Session session,int pageSize,int pageNo) {
            Criteria criteria=session.createCriteria(StuInfo.class,"stu");
            criteria.setMaxResults(pageSize);
            int firstResult=(pageSize-1)*pageNo+1;
            criteria.setFirstResult(firstResult);
            List<StuInfo> stuInfos=criteria.list();
            for (StuInfo stuInfo : stuInfos) {
                System.out.println(stuInfo);
            }
        }

    说明:

    1. setMaxResults()为设置每页的容量。

    2. setFirstResult()为设置起始值。

    3. 不要忘记使用list()

     4.API方法应该只能用户查询不能用户修改。

    关于HQL部分可以参考此文:HQL查询

  • 相关阅读:
    Rails坑之 gem 'pg', '0.15.1' 安装报错
    Ruby常用文件操作
    Linux各个目录浅析
    Ruby一行代码实现快速排序
    调试常用的方法
    Ruby实现冒泡排序
    Ruby代理例子
    新建一个包,并生成可以直接在命令行执行的指令
    Linux定时任务Crontab命令详解
    php安装完后配置php.ini和php-fpm.conf
  • 原文地址:https://www.cnblogs.com/LiuChunfu/p/5010721.html
Copyright © 2011-2022 走看看