• Hibernate中的HQL


    一、查询所有的时候

     List<Company> list=session.createQuery("from Company as c order by c.cid desc").list();

      不要写select *

      注意:此处的Company不是表,而是映射过来的类。

    二、取得单笔数据

      Query<Company> query=session.createQuery("from Company as a order by a.price desc");
    
      query.setMaxResults(1);//限定结果集就一笔数据
    
      com=query.uniqueResult();//装载这一笔数据

     方法为setMaxResults()和uniqueResult()方法。

    三、带有参数的HQL语句

      Query<Company> query=session.createQuery("from Company as a where a.name=:p1");
          query.setParameter("p1","京东");
    
      query.setMaxResults(1);
    
      com=query.uniqueResult();

     :p1,前面的冒号代表这是个变量。

    四、取得多个字段,将取出的东西放在list中,前面代码已经出现,不在赘述

    五、取得指定字段,使用投影

    Query query=session.createQuery("select a.name,a.price form Company as a");
    list=query.list();
    Iterator it=list.iterator();
    Object[] obj=null;//投影对象
    while(it.hasNext()){
        obj=((Object[])it.next());
        System.out.printf("%s---%s
    ",obj[0],obj[1]);
    }

    六、汇总函数的使用(也是用投影方法)

    List list=null;
            session = sessionFactory.openSession();
            try{
                Query query=session.createQuery("select " +
                        "count(c),sum(c.price),avg(c.price)," +
                        "min(c.price),max(c.price) " +
                        "from Company as c");
                list=query.list();
                Iterator it=list.iterator();
                Object[] obj=null;//投影对象
                while (it.hasNext()) {
                    obj=((Object[])it.next());
                    System.out.printf("%s---%s---%s---%s---%s
    ",obj[0],obj[1],obj[2],obj[3],obj[4]);
                }

    七、比较

     Query query=session.createQuery("from Emp as a where a.salary>:p1 and a.company.price>:p2");
           query.setParameter("p1",2000.0);
           query.setParameter("p2",100.0); list
    =query.list(); for(Emp e :list){ System.out.printf("%s---%s---%s ",e.getName(),e.getEmail(),e.getCompany().getName()); }

    这里为了防止SQL注入,不写固定的比较值,而采用参数设置的方法。HQL中set只能用名称的方法来设置参数,不能使用index索引位置得方法。索引位置的方法只能用在SQL形式下。

      如下:

    Query query=session.createNativeQuery("select * form emp where salary>?");
    query.setParameter(1,1200)

    八、范围查询

      

    try{
                Query query=session.createQuery("from Emp as a " +
                        "where a.salary between 2000 and 13000 " +
                        "and a.company.name in('微软','百度')");
                list=query.list();
                for(Emp e :list){
                    System.out.printf("%s---%s---%s
    ",e.getName(),e.getEmail(),e.getCompany().getName());
                }
            }

    九、查询分页显示

      公式:每页的记录条数(pagesize)、当前页号(pageNo)

         query.setFirstResult((pageNo-1)*pageSize);

         query.setMaxResult(pageSize);

    try{
                Query query=session.createQuery("from Emp as a");
                int pageSize=2;//每页的记录条数
                int pageNo=1;//当前页号,即第几页
                //limit 1 ,2
                query.setFirstResult((pageNo-1)*pageSize);//指定从哪一个对象开始检索 limit (pageNo-1)*pageSize ,pageSize
                query.setMaxResults(pageSize);//指定一次最多检索出的对象数目
                list=query.list();
                for(Emp c :list){
                    System.out.printf("%s---%s---%s
    ",c.getName(),c.getEmail(),c.getCompany().getName());
                }
    
            }

    十、内连接(等效于一个外键连接)

     try{
                Query query=session.createQuery("from Emp as a inner join a.company as b ");
                list=query.list();
                for(MyReport c :list){
                    System.out.printf("%s-%s--%f
    ",c.getName(),c.getCname(),c.getMoney());
                }
            }

    十一、外连接(分为左外链接、右外连接)

      左外连接:以Emp为主表,以company作为从表,如果emp有多于company表的数据同样打印出来,而company表多出来的不打印。

      右外连接相反

    try{
    
                Query query=session.createQuery("from Emp as a left outer join a.company as b");
                list=query.list();
    
                Iterator it=list.iterator();
                Object[] obj=null;//投影对象
                while (it.hasNext()) {
                    obj=((Object[])it.next());
                    Company com=null;
                    if(obj[1]!=null){
                        com=(Company)obj[1];
                    }
                    Emp emp=(Emp)obj[0];
    
    
                    System.out.printf("%s---%s
    ",emp.getName(),com!=null?com.getName():"");
    
                }
    
            }

    十二、交叉连接(笛卡尔乘积)

      

    try{
                Query query=session.createQuery("from Company as a ,Emp as b ");
                list=query.list();
                Iterator it=list.iterator();
                Object[] obj=null;//投影对象
                while (it.hasNext()) {
                    obj=((Object[])it.next());
                    Emp emp=(Emp)obj[1];
                    Company com=(Company)obj[0];
                    System.out.printf("%s---%s
    ",com.getName(),emp.getName());
                }
            }

    十三、动态实例化查询:在查询过程中不仅可以查询到数据,还能将查询的内容构造一个类

      

    try{
                Query query=session.createQuery("select " +
                        "new com.weikun.po.MyReport(a.name, a.sex,b.name,b.price) " +
                        "from Emp as a inner join a.company as b ");
                list=query.list();
                for(MyReport c :list){
                    System.out.printf("%s-%s--%f
    ",c.getName(),c.getCname(),c.getMoney());
                }
            }catch(Exception ex){
                ex.printStackTrace();
            }
  • 相关阅读:
    7.1 异常处理结构
    第 7 章 异常处理结构、代码测试与调试
    6.4.2 案例精选
    6.4.1 标准库 os、os.path 与 shutil 简介
    设计模式----装饰模式
    设计模式---单例模式
    设计模式--工厂方法模式
    设计模式-简单工厂模式
    设计模式基础知识
    更改Mysql数据库中的数据出现乱码问题
  • 原文地址:https://www.cnblogs.com/television/p/8682987.html
Copyright © 2020-2023  润新知