Hibernate HQL基础

1、Query接口java

1.org.hibernate.Query接口定义有执行查询的方法(该方法完成HQL语句的解析与执行过程,并返回查询的结果。就像SQL语句没有jdbc接口,它也就是普通的字符串变量,HQL语句也同样,编写好的HQL语句也就是一个普通的字符串变量,而hibernate框架就负责解析HQL语句,而后根据配置信息生成相应的SQL语句来执行数据库的查询操做,那么完成这个过程依靠的就是Query接口);
2.Query接口支持方法链编程风格,使得程序代码更为简洁(方法链编程:调用方法后,返回的结果依然是调用这个方法的对象,能够在调用方法后直接调用该对象的其余方法,这样可使用一个程序语句完成多个方法的调用与执行。在Query接口中,方法链编程使用最多的场景是查询参数的动态设置,特别是多个参数的设置)
3.Query实例的建立:
  a.Session的createQuery()方法建立Query实例
  b.createQuery方在调用时须要传递一个参数(即要查询的HQL语句),createQuery(hql)
4.Query执行查询
  a.Query接口的list()方法执行HQL查询
  b.list()方法返回结果数据类型为java.util.List,List集合中存放符合查询条件的持久化对象程序员

 

2、HQL语句sql

HQL语句中能够直接使用"from 类名"就能够查询到此类对应数据库表中的全部信息.不须要像sql那样"select*from 表名",直接"form 类名"便可.
list()方法返回的是HQL语句所查询的类的持久化对象的集合.因此通常定义一个带泛型的List集合来存储.
  Query query=session.createQuery("from Student");
  List<Student> list=query.list();
  for(List l:list){
    System.out.println(l);
  }数据库

注意:HQL是面向对象的查询,查询的是类,不像sql同样,直接查询表.所以在from 后面加的是类名(注意大小写).list()方法会根据查询的类名而后去映射文件中找到相应的数据库表,此时便把HQL语句解析成sql语句.再查询到相应的记录,最后返回记录的持久化对象的集合.
对于Hiberante5.2.4,query.list()方法已经弃用:
  public void selletTest() {
    String hql = "from Seller";
    Query query = session.createQuery(hql, Seller.class);
    // 注:hibernate5.2.4已经弃用了query.list()方法
    List<Seller> sellers = query.getResultList();
    for (Seller seller : sellers) {
      System.out.println(seller);
    }
  }编程

 

*****HQL语句形式*******
select子句:用来指定查询结果中的对象和属性,并指定以何种数据类型返回 (在最前面)
from子句:用来指定hql语句的查询目标,即映射配置的持久化类及其属性
where子句:逻辑表达式,用来设置查询条件,限制返回结果和范围
group by子句:分组查询语句
having子句:对分组进行限制条件设置
order by子句:用来指定查询结果中的实例对象的排序
注:From子句在HQL语句中不可或缺的组成部分,一个最简单的HQL语句形式只要有from就能够了,其余的子句均可以省略,这点与SQL语句不一样数组

**********初学HQL注意的问题***********
一、HQL是面向对象的查询语言,其查询主体是持久化类及其属性,而SQL查询主体是数据库表与表的字段;HQL对Java类与属性大小写不敏感、SQL语句对大小写敏感;
二、HQL与SQL在形式上很是类似,特别是HQL在设计上尽可能符合以前SQL开发人员的开发习惯,在使用上很是容易与SQL混淆,可是咱们不能被表象所迷惑,要认清本质;
三、HQL对关键字不区分大小写,好比以前提到的几个SQL子句其中的关键字,from,where,group by,having,order by...等,只要拼写正确,大小写并不重要,可是为了代码的可读性与美观性,习惯上对HQL的全部关键字小写session

 

3、查询对象——from子句框架

from子句:
from子句是HQL语句的最简形式,换句话说,HQL语句只须要from子句就能够执行查询了,这是为何呢?
这是由于from子句指定了HQL语句查询的主体----映射配置的持久化类及其属性,当咱们编写的HQL语句只有from子句的时候,HQL框架默认就是查询该持久化类的全部实例以及该持久化类映射配置的信息,当HQL框架将HQL解析成SQL时,就会查询该持久化类映射的数据表中的全部映射字段信息,并将返回的查询结果封装成该持久化类的list集合hibernate

hibernate默认的是懒加载状态,默认状态下是不查询外键信息所对应的数据的,只有当咱们须要的时候才会根据具体的须要进行查询。在控制台输出语句中,已经输出过的外键所对应的持久类查询sql语句再也不重复输出。设计

from子句中持久化类的引用:
一、不须要引入持久化类的全限定名(如from com.imooc.model.Seller),直接引入类名(from Seller)便可
二、咱们知道在java环境中必定要指明全限定名,这样java环境才知道去获取这个类,而HQL语句中之因此能够省略,是由于auto-import自动引入缺省状况。hibernate框架中,在解析HQL语句时,会根据映射配置信息自动完成持久化类的导入,这样的方式更加方便,也更加符合程序员的编程习惯。
三、在from子句中全限定名的引用与直接引入类名是同样,并不会报错!

from子句中别名的引用:
1.为被查询的类指定别名
2.在HQL语句其余部分经过别名引用该类
3.别名命名习惯,参考Java变量的命名习惯
为类指定别名:from Seller as s/from Seller s,要保留代码的可读性

 

4、选择——select子句

1.以Object[]形式返回选择的属性:
2.以List形式返回选择的属性
3.以map形式返回选择的属性
4.以自定义类型返回选择的属性
5.获取独特的结果-distinct关键字

hql中查询一个字段 返回的是List<Object>对象,查询多个字段返回的是List<Object[]>,查询全部字段返回的是List<实体类>对象,建议多使用别名来区分不一样表中的相同字段
  String hql="select s.name,s.tel,s.address,s.star from Seller s ";
  Query query=session.createQuery(hql);
  List<Object[]> list=query.list();
  for (Object[] objects : list) {
    System.out.println(" name : "+objects[0]);
    System.out.println(" tel : "+objects[1]);
    System.out.println(" address : "+objects[2]);
    System.out.println(" star : "+objects[3]);
    System.out.println("");
  }

选择-select子句,做用:指定只须要的查询信息,提升程序的运行效率
1.以Object[]形式返回选择的属性:
注意:hql的select查询语句中,若是指定了多个查询字段,则返回的是一个Object[]数组,然而若是只指定了一个查询字段,则返回的是一个Object对象。
  String hql = "select s.name,s.tel from Seller s";
  Query query = session.createQuery(hql);
  List<Object[]> sellers = query.list();
  for(Object[] objs:sellers){
    System.out.println("name:"+objs[0]);
    System.out.println("tel:"+objs[1]);
  }(若是是单个查询字段的话就只须要把上面的Object[]中的[]去掉,打印输出时不须要指明下标)

2.以List形式返回选择的属性
  String hql = "select new list(s.name,s.tel,s.address) from Seller s";
  ...
  List<List>lists=query.getResultList();

3.以map形式返回选择的属性
  注意:key为索引值,是字符串类型(map.get("0")),若是给查询字段指定了别名,则以该别名为key的值,使用Map集合时考虑使用别名获取属性信息  
  String hql = "select new map(s.name,s.tel,s.address) from Seller s";

4.以自定义类型返回选择的属性
  (1)持久化类中定义对应的构造器
  (2)select子句中调用定义的构造器
  注意:默认无参构造器是须要的,由于,在Hibernate没有指定的查询的放回集合时候,Hibernate会自动去找默认构造器,若是不存在,则会出现异常
  String hql = "select new Seller(s.name,s.tel,s.address) from Seller s";

5.获取独特的结果-distinct关键字
  distinct关键字 消除查询过程当中重复的元素
  String hql = "select distinct s.sex from Seller s";

 

5、限制——where子句

1.比较运算
2.范围运算
3.字符串模式匹配
4.逻辑运算
5.集合运算
6.在HQL中使用+、-、*、/运算符
7.查询单个对象(uniqueResult方法)

比较运算符:=、<>、<、>、>=、<=
null值判断——is [not] null
HQL中的x=null会被解析为SQL中的x is null、x<>null会被解析为SQL中的x is not null

范围运算:
1.[not] in(列表)(列表既能够明确指出,也能够是子查询)
2.[not] between 值1 and 值2
//寻找价格(不)是4000或5000的商品
String hql="from Commodity c where c.price (not) in (5000,4000)";
//寻找价格(不在)在200到4000的商品
String hql1="from Commodity c where c.price (not) between 200 and 4000";

字符串模式匹配:
1.like 关键字
2.通配符:% 匹配任意个字符,_ 匹配一个字符

逻辑运算符
1.and(逻辑与)、or(逻辑或)
2.not(逻辑非)
String hql="from Commodity c where c.price between 100 and 4000 and c.category like '%电脑%'";
String hql1="from Commodity c where c.price between 100 and 4000 or c.category like '%电脑%'";

集合运算:
一、is [not] empty,集合【不】为空,不包含任何元素;对应SQL的exists运算
二、member of 元素属于集合 ;对应SQL的in运算。

四则运算
1.HQL语句中也可使用+ - * / 四则运算
2.四则运算能够在where子句和select子句中使用

查询单个对象:
query接口的uniqueResult方法
1.该方法的返回是实例对象而不是返回集。
2.须要注意的是咱们必需要经过where将查询获得的记录只剩下一条或者查询不到。若是有一条以上就会发生异常。

 

6、排序——order by子句

asc升序,desc降序。
多个排序规则用“,”隔开;表示前一个规则中排序条件相同则用后一个排序规则

  

相关文章
相关标签/搜索