一、查询所有的时候

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

Hibernate中的HQL的更多相关文章

  1. Hibernate中关于HQL查询返回List<Object>数据的结果集问题

    ---恢复内容开始--- 开发中遇到的一个小问题,使用Hibernate中的HQL查询时,使用query.list()查询出来的是一个List<Object>结果集 原来代码: publi ...

  2. 分享知识-快乐自己:Hibernate 中的 HQL 语句的实际应用

    概要: Hibernate 支持三种查询方式: HQL查询.Criteria查询及原声 SQL (Native SQL)查询. HQL(Hibernate Query Language,Hiberna ...

  3. Hibernate中的HQL语言

    一.HQL语言简介 HQL全称是Hibernate Query Language,它提供了是十分强大的功能,它是针对持久化对象,直接取得对象,而不进行update,delete和insert等操作.而 ...

  4. Hibernate中的HQL查询与缓存机制

    HQL:完全面向对象查询 SQL的执行顺序: 1.From 2.Where 过滤基础数据 where与having的区别:1.顺序不同 2.where过滤基础数据 3. 过滤聚合函数 3.Group ...

  5. Hibernate 中update hql语句

    今天在MySQL中用hibernate测试update语句发现以下问题: update语句竟然不去作用: 表机构如下: create table student(sid int primary key ...

  6. Hibernate中的HQL的基本常用小例子,单表查询与多表查询

    <span style="font-size:24px;color:#3366ff;">本文章实现HQL的以下功能:</span> /** * hql语法: ...

  7. Hibernate中常用HQL

    HQL是Hibernate自带的查询语言 HQL是一种面向对象的查询语言.SQL的操作对象是数据表和列等数据对象,而HQL的操作对象是类.实例.属性等. HQL的语法很像SQL的语法 以下举例均以学生 ...

  8. hibernate中使用HQL进行数据库查询

    1.写的规则比较简单,我讲一下,如图Station这个不是数据库中的表,而是entity包中的类名Station,可以省略 select * 2.返回的类型自动转化为String类型,不用你自己再转化 ...

  9. Hibernate 中出现 users is not mapped 问题

    Hibernate 中出现 users is not mapped 问题: 解答:HQL语句中表名应该是ORM映射的类名,所以应该改成:  (如果是用注解生成实体类,那就是注解的那个类)String ...

随机推荐

  1. 轻松学习JavaScript十二:JavaScript基于面向对象之创建对象(一)

    这一次我们深入的学习一下JavaScript面向对象技术,在学习之前,必要的说明一下一些面向对象的一些术语. 这也是全部面对对象语言所拥有的共同点.有这样几个面向对象术语: 对象 ECMA-262把对 ...

  2. ios OpenCv的配置和人脸识别技术

    作为一个好奇心非常重的人,面对未知的世界都想去一探到底. 于是做了个人脸识别的demo. 眼下国内的关于opencv技术文章非常少.都是互相抄袭.关键是抄个一小部分还不全.时间又是非常久之前的了,和如 ...

  3. [Golang] 从零開始写Socket Server(3): 对长、短连接的处理策略(模拟心跳)

    通过前两章,我们成功是写出了一套凑合能用的Server和Client,并在二者之间实现了通过协议交流.这么一来,一个简易的socket通讯框架已经初具雏形了,那么我们接下来做的.就是想办法让这个框架更 ...

  4. 【NOI 2002】 银河英雄传说

    [题目链接] https://www.luogu.org/problemnew/show/P1196 [算法] 并查集 [代码] #include<bits/stdc++.h> using ...

  5. NEU 1006 Intermediary

    1006: Intermediary 时间限制: 1 Sec  内存限制: 128 MB提交: 261  解决: 25[提交][状态][讨论版] 题目描述 It is widely known tha ...

  6. windows安装mysql注意点

    MySQL安装文件分为两种,一种是msi格式的,一种是zip格式的. 以msi格式安装完成后,先别忙着启动mysql,我们还需要修改一下配置文件(如果没有配置,之后启动的时候就会出现图中的错误哦!:错 ...

  7. ASP.NET在IIS 5/6上的运行模型(ISAPI)

    IIS 5.X中的ASP.NET 实现了Web Server和ASP.NET App的分离. IIS作为Web Server运行在InetInfo.exe进程上.该进程是非托管的本地进程. ASP.N ...

  8. Linux学习日记——字符处理

    (菜鸡学习日记 各种使用命令只列举了常用几种,发现错误望指正) 一.管道 在Linux 中,管道就是一个固定大小的缓冲区,大小为一页4K.它是一种通信的机制,可以使用管道符“ | ” 来连接进程,连接 ...

  9. JAVA 日期工具类的总结

    一般,在项目中,我们会会经常使用到日期的各种方式的处理,在各个业务逻辑操作中,都需要相关的日期操作,因此,实现项目中的日期工具类的提出,还是十分重要的,下面,就项目中常用到的日期的相关操作方式,做了一 ...

  10. 数据库自动备份压缩脚本(备份最近七天,七天之前自动删除,只保留rar文件)

    把下面脚本添加到服务器计划任务中去,设置为每天执行即可,文件备份路径即为脚本所在路径,必须安装压缩文件 @echo offrem 计算指定天数之前的日期,用于后面删除指定天数的数据set DaysAg ...