HQL查询——HQL查询的基本用法

1.HQL语法类似于SQL语法,但是需要注意的是,HQL是一种完全面向对象的查询语言。SQL语言操作的对象是数据表、列等数据库对象,而HQL语言的操作对象是类、实例、属性等。

2.由于HQL语言是面向对象的查询语言,所以他具有面向对象的特征,即支持继承和多态。

3.HQL查询依赖于Hibernate提供的Query类,每个Query类实例对应一个查询对象。

4.使用HQL查询的步骤如下:

(1)获取Hibernate Session对象;

(2)编写HQL语句;

(3)如果以HQL语句作为参数,调用Session的createQuery()方法创建查询对象;

(4)如果HQL语句包含参数,则调用Query的setXxx()方法为参数赋值;

(5)调用Query对象的list()方法或者uniqueResult()方法返回查询结果列表(持久化实体集)。

5.执行HQL查询的例子:

 import java.text.SimpleDateFormat;
 import java.util.Arrays;
 import java.util.Date;
 import java.util.List;

 import org.hibernate.Session;
 import org.hibernate.Transaction;

 /**
  * @author admin
  *    使用HQL查询的例子
  */
 public class HqlQuery {
     public static void main(String[] args)throws Exception {
         HqlQuery mgr = new HqlQuery();
         //调用第一个查询方法
         mgr.findPersons();
         //调用第二个查询方法
         mgr.findPersonsByHappenDate();
         //调用第三个查询方法
         mgr.findPersonProperty();
     }
     //第一个查询方法
     private void findPersons(){
         //获得Hibernate Session对象
         Session session = HibernateUtil.currentSession();
         //开始事务
         Transaction tx = session.beginTransaction();
         //使用HQL语句创建Query对象
         List pl = session.createQuery("select distinct p from Person p join p.myEvents where title = :eventTitl")
                 //执行setString方法为HQL语句中的参数赋值
                 .setString("eventTile", "普通事情")
                 //使用Query实例的list()方法获取查询的全部实例
                 .list();
         //遍历查询的全部结果
         for(Object ele : pl){
             Person p = (Person)ele;
             System.out.println(p.getName());
         }
         //提交事务
         tx.commit();
         //关闭Session
         HibernateUtil.closeSession();
     }
     //第二个查询方法
     private void findPersonsByHappenDate()throws Exception{
         //获取Hibernate Session对象
         Session session = HibernateUtil.currentSession();
         //开始事务
         Transaction tx = session.beginTransaction();
         //解析出Date对象
         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
         Date start = new Date("2017-01-03");
         //通过Session对象的createQuery()方法创建Query对象
         List pl = session.createQuery("select distinct p from Person p inner join p.myEvents evebt "
                 + "where event.happenDate"
                 + "between:firstDate and :endDate").
                 //设置参数
                 setDate("firstDate", start).
                 setDate("endDate", new Date()).
                 //返回结果
                 list();
         //遍历结果集
         for(Object ele:pl){
             Person p = (Person)ele;
             System.out.println(p.getName());
         }
         //提交事务
         tx.commit();
         //关闭Session
         HibernateUtil.closeSession();
     }
     //第三个查询方法:属性的查询
     private void findPersonProperty(){
         //获得Session对象
         Session session = HibernateUtil.currentSession();
         //开始事务
         Transaction tx = session.beginTransaction();
         //使用HQL创建Query对象
         List pl = session.createQuery("select distinct p.id,p.name,p.age"
                 + "from Person p join p.myEvents")
                 //Query调用list()方法查询得到的全部属性
                 .list();
         //遍历查询的全部结果
         for(Object ele:pl){
             Object[] objs = (Object[])ele;
             System.out.println(Arrays.toString(objs));
         }
         //提交事务
         tx.commit();
         //关闭Session对象
         HibernateUtil.closeSession();
     }
 }

6.HQL语句中可以使用占位符作为参数。HQL中的占位符既可以使用英文问号+索引的形式(?N);也可以使用有名字的占位符,使用有名字的占位符时,应该在占位符名字前增加英文冒号(:)。

7.成功编写了HQL语句以后就可以使用Session对象的createQuery(hql)方法创建一个Query,Query对象使用setXxx()方法为HQL语句的参数赋值。Query的所有setXxx()方法都有两个版本,分别用于根据参数索引赋值和根据参数名字赋值。

8.Query对象可以连续为多次的参数赋值,因为Query对象的setXxx()方法返回的依然是一个Query对象本身,在最后使用Query对象的list()方法来获取查询到的全部结果。

9.注意:HQL语句本身是不区分大小写的。即HQL语句的关键字、函数都是不区分大小写的。但是HQL语句中的所使用的包名、类名、实例名、属性名都是区分大小写的。

HQL查询——HQL查询的基本用法的更多相关文章

  1. HQL常用的查询语句

    摘录自某人,比较有用,比较全. // HQL: Hibernate Query Language. // 特点: // >> 1,与SQL相似,SQL中的语法基本上都可以直接使用. // ...

  2. Hibernate的几种查询方式-HQL,QBC,QBE,离线查询,复合查询,分页查询

    HQL查询方式 这一种我最常用,也是最喜欢用的,因为它写起来灵活直观,而且与所熟悉的SQL的语法差不太多.条件查询.分页查询.连接查询.嵌套查询,写起来与SQL语法基本一致,唯一不同的就是把表名换成了 ...

  3. 《Java从入门到放弃》入门篇:hibernate查询——HQL

    不知不觉又到了hibernate的最后一篇了,只感觉时光飞逝~,岁月如梭~! 转眼之间,我们就···························,好吧,想装个X,结果装不下去了,还是直接开始吧· ...

  4. 二。Hibernate 查询 HQL、SQL方式

    hibernate的查询1.HQL方式:所有查询都是根据java对象名来完成,对象名替换表名2.SQL方式:保留原来的sql查询风格3.可以通过设置第一条和最大条数来实现各种数据库的分页查询4.通过B ...

  5. HQL和SQL查询

     转自http://blog.csdn.net/aaa1117a8w5s6d/article/details/7757097 HQL和SQL的区别 标签: sqlhibernatejavasessio ...

  6. HQL多表查询

    ------------------siwuxie095 HQL 多表查询 以客户和联系人为例(一对多) 1.内连接 (1)hql 语句写法 from Customer c inner join c. ...

  7. Hibernate HQL多表查询

    1.内连接和迫切内连接 (1)内连接 HQL语句:from 实体类名 实体类别名 inner join 实体类别名.表示另一个表数据的集合名称 (2)迫切内连接 HQL语句:from 实体类名 实体类 ...

  8. Hibernate 笔记 HQL查询 条件查询,聚集函数,子查询,导航查询

    在hibernate中进行多表查询,每个表中各取几个字段,也就是说查询出来的结果集并没有一个实体类与之对应,如何解决这个问题? 解决方案一,按照Object[]数据取出数据,然后自己组bean 解决方 ...

  9. Hibernate的批量查询——HQL

    HQL(Hibernate Query Language)查询: 1.查询所有学生信息: public static void testSel() { Session session = Hibern ...

随机推荐

  1. swiper.animate~之~可以执行两种动画的升级版的Swiper Animate

        1.下载插件swiper.animate-twice.min.js,加载进页面. <!DOCTYPE html> <html> <head> ... < ...

  2. React Native IOS源码初探

    原文链接 http://www.open-open.com/lib/view/open1465637638193.html 每个项目都有一个入口,然后进行初始化操作,React Native 也不例外 ...

  3. 用linq批量更新数据集

    对于数据集需要更新所有对象的FTaxRate 赋值为ftax_rate 以下采用遍历方式更新: foreach (var entry in _dataEntityList){ entry.FTaxRa ...

  4. Single Responsibility Principle 单一职责原则

  5. Windows Server 2008 R2组策略创建用户桌面快捷方式

    问题: 如何让所有域用户桌面有一个公司共享的快捷方式,让所有域用户直接双击就能打开公司共享. 解决办法: 1.创建一个zhuyu组织单元 ----- 在zhuyu组织单元创建一个域用户user1. 2 ...

  6. sql中datetime 和 timestamp

    datetime 1.允许为空值,可以自定义值,系统不会自动修改其值. 2.不可以设定默认值,所以在不允许为空值的情况下,必须手动指定datetime字段的值才可以成功插入数据. 3.虽然不可以设定默 ...

  7. noi 1.5 45:金币

    描述 国王将金币作为工资,发放给忠诚的骑士.第一天,骑士收到一枚金币:之后两天(第二天和第三天)里,每天收到两枚金币:之后三天(第四.五.六天)里,每天收到三枚金币:之后四天(第七.八.九.十天)里, ...

  8. zjuoj 3773 Paint the Grid

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3773 Paint the Grid Time Limit: 2 Secon ...

  9. struts---JSP界面验证码生成与验证

    之前想做一个随机验证码的功能,自己也搜索了一下别人写的代码,然后自己重新用struts2实现了一下,现在将我自己实现代码贴出来!大家有什么意见都可以指出来! 首先是生成随机验证码图片的action: ...

  10. gulp 安装 使用 和删除

    1.安装 全局安装: npm intstall gulp -g      (首先你得有node.js ,这个可以去node 官网下载个iso的镜像安装包,傻瓜式安装.自带npm) 安装在项目中: 首先 ...