zoukankan      html  css  js  c++  java
  • Hibernate 笔记 HQL查询 条件查询,聚集函数,子查询,导航查询

    在hibernate中进行多表查询,每个表中各取几个字段,也就是说查询出来的结果集并没有一个实体类与之对应,如何解决这个问题?
    解决方案一,按照Object[]数据取出数据,然后自己组bean
    解决方案二,对每个表的bean写构造函数,比如表一要查出field1,field2两个字段,那么有一个构造函数就是Bean(type1 filed1,type2 field2) ,然后在hql里面就可以直接生成这个bean了。具体怎么用请看相关文档。

    本笔记继续使用dept部门表,emp员工表,一对多、多对一双向映射。

    1 条件查询

    1.1 查询 员工表emp中 年龄eage小于30,月薪esal大于20000的员工姓名ename

        sql:select ename from emp where eage<? and esal >?;

        hql: select ename from Emp where eage<? and esal >?

    1.2 问号的设置与别名

     问号(?)的设置使用.setParameter(位置, 属性值) 在sql语句中问号的位置是从1开始,在hql中从零开始。

     在hql中,问号(?)也可以起别用,:后面紧跟别名,setParameter("age", 30)方法也随之改变,将原先的数字改成"别名",如下所示

               String hql="select ename from Emp where eage<:age and esal >:sal";
                 Query query= session.createQuery(hql).setParameter("age", 30).setParameter("sal", 20000f).list();   

    1.3 一组问号的设置

          对于一组问号也可以设置别名:如 查询在1,2部门的员工姓名

                 hql="select ename from Emp where did in (?,?)";

                 hql="select ename from Emp where did in (:d)";

                 Query query= session.createQuery(hql).setParameter("d", new Object[]{1,2}).list();

    public void Test9() throws Exception{ 
    Configuration config=new Configuration().configure();
    SessionFactory sessionFactory= config.buildSessionFactory();
    Session session=null;
    Transaction tr=null;
    try{
    session= sessionFactory.openSession();
    tr=session.beginTransaction();
    String hql="select ename from Emp where eage<? and esal >?";
    Query query= session.createQuery(hql).setParameter(0, 30).setParameter(1, 20000f); //设置问号,从0开始。
    List<String> list = query.list();
    for(String message:list){
    System.out.println(message);
    }
    tr.commit();
    }catch(Exception e){
    tr.rollback();
    }finally{
    if(session!=null){
    session.close();
    }
    if(sessionFactory!=null){
    sessionFactory.close();
    }
    }
    }

    结果:

    Hibernate: select emp0_.ename as col_0_0_ from emp emp0_ where emp0_.eage<? and emp0_.esal>?
    刘亦菲
    白百何
    文章
    林月如

    2 条件查询的常用关键字

        2.1 distinct 过滤重复的值

                查询员工表中的所有员工姓名,并去掉重复值

                hql="select distinct  ename from Emp ";  

        2.2 delete 删除

              删除年龄大于25的员工

         hql="delete Emp where eage>25"; 删除年龄大于25岁的用户

                  Query query=session.createQuery(hql);

              query.executeUpdate();           //执行  executeUpdate 方法返回int类型。

            tx.commit();            //成功,则提交,对数据库操作

        2.3 update 更新

              更新员工编号11的年龄为22

        String hql="update Emp s set s.eage='22' where s.eid=11";   //更新语句

               Query query=session.createQuery(hql);

                   query.executeUpdate();           //执行

                   tx.commit();           //成功,则提交

        2.4 between...and...和not between... and...确定查询范围

              查找员工表中年龄在20到30之间的员工姓名

              hql="select ename from Emp where eage between 20 and 30"

      2.5 in和not in确定查询集合

              查询员工属于低1,2部门的员工姓名

              hql="select ename from Emp where did in(1,2)"

        2.6 like进行模糊查询

              用like进行模糊查询时有两个可用的通配符:“%”和“_”。“%”代表长度大于等于0的字符,“_”代表长度为1的单个字符。

              查询员工表中姓名中带有刘的员工

              hql="select ename from Emp where ename  like '%刘%'"

         2.7 逻辑与 and 逻辑或 or

              查询员工中薪水大于2000 同时年龄小于30的员工姓名

              hql="select ename from Emp where esal>2000 and eage<30";

              查询员工中,年龄大于40或者年龄小于30的员工

              hql="select ename  from Emp where eage>40 or eage<30";

         2.8 order by对结果进行排序

             对薪水进行排序,从小到大

             hql="select esal from Emp where order by esal asc";

             对年龄进行排序,倒叙,

             hql="select ename from Emp where order by eage desc";

         2.9 group by对记录进行分组

            根据部门分组,求出各组的平均薪水

            hql=" select avg(esal) from Emp group by did";

         2.10 having 对分组进行筛选

             根据部门分组,查出员工所在组平均薪水大于10000的员工姓名

             hql=" select ename from Emp group by did having  avg(esal)>10000";

     3 聚集函数

    查询emp员工表中有多少个员工。

    sql:select count(ename) from emp;

    hql: select count(ename) from Emp;

    聚集函数及含义:

    hql: select avg(esal) from Emp;   薪水平均值

    hql: select max(esal) from Emp;  薪水最大值

    hql: select sum(esal) from Emp;  薪水最小值

        public void Test91() throws Exception{ 
    Configuration config=new Configuration().configure();
    SessionFactory sessionFactory= config.buildSessionFactory();
    Session session=null;
    Transaction tr=null;
    try{
    session= sessionFactory.openSession();
    tr=session.beginTransaction();
    String hql="select count(ename) from Emp";
    Object count=session.createQuery(hql).uniqueResult(); //uniqueResult()方法返回Object类型 
    System.out.println(count);

    tr.commit();
    }catch(Exception e){
    tr.rollback();
    }finally{
    if(session!=null){
    session.close();
    }
    if(sessionFactory!=null){
    sessionFactory.close();
    }
    }
    }

    结果:

    Hibernate: select count(emp0_.ename) as col_0_0_ from emp emp0_15

    4 子查询

    Hibernate 支持子查询,所谓子查询就是,要查询的字段及信息在A表,条件在B表。语法与sql语句相似。

    public void Test9() throws Exception{ 
    Configuration config=new Configuration().configure();
    SessionFactory sessionFactory= config.buildSessionFactory();
    Session session=null;
    Transaction tr=null;
    try{
    session= sessionFactory.openSession();
    tr=session.beginTransaction();

    String hql="select ename from Emp where did in (select did from Dept where daddress = 302)";

    Query query= session.createQuery(hql);
    List<String> list = query.list();
    for(String message:list){
    System.out.println(message);
    }
    tr.commit();
    }catch(Exception e){
    tr.rollback();
    }finally{
    if(session!=null){
    session.close();
    }
    if(sessionFactory!=null){
    sessionFactory.close();
    }
    }
    }

    结果:

    Hibernate: select emp0_.ename as col_0_0_ from emp emp0_ where did in (select dept1_.did from dept dept1_ where dept1_.daddress=302)
    李世民
    曹操
    和珅
    刘诗诗

    5 导航查询

    e.dept.daddress=301

    员工所在部门的地址是301

    public void Test9() throws Exception{ 
    Configuration config=new Configuration().configure();
    SessionFactory sessionFactory= config.buildSessionFactory();
    Session session=null;
    Transaction tr=null;
    try{
    session= sessionFactory.openSession();
    tr=session.beginTransaction();

    String hql="select ename from Emp e where e.dept.daddress=301 ";

    Query query= session.createQuery(hql);
    List<String> list = query.list();
    for(String message:list){
    System.out.println(message);
    }
    tr.commit();
    }catch(Exception e){
    tr.rollback();
    }finally{
    if(session!=null){
    session.close();
    }
    if(sessionFactory!=null){
    sessionFactory.close();
    }
    }
    }

    结果:

    Hibernate: select emp0_.ename as col_0_0_ from emp emp0_, dept dept1_ where emp0_.did=dept1_.did and dept1_.daddress=301
    刘德华
    贺龙
    白百何
    文章
    林月如

  • 相关阅读:
    作为前端开发兼任产品专员是一种咋样的体验
    css忽略某一层的存在:pointer-events:none
    响应式网站对百度友好关键
    移动站点对百度友好全解
    如何布局您的PC站和移动站,并表达两者之间内容的对应关系
    猫眼电影App抓包获取评论数据接口
    字符串模拟大数相加——Java实现
    计算机网络知识小结
    二叉树与双向链表问题
    算法编程题积累(4)——腾讯笔试"有趣的数字“问题
  • 原文地址:https://www.cnblogs.com/whsa/p/3779670.html
Copyright © 2011-2022 走看看