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(); }