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\n",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\n",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\n",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\n",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\n",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\n",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\n",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\n",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\n",c.getName(),c.getCname(),c.getMoney());
            }
        }catch(Exception ex){
            ex.printStackTrace();
        }

 

转载于:https://www.cnblogs.com/television/p/8682987.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值