Hibernate学习-Hibernate查询语言HQL

HQL(Hibernate Query Language)Hibernate查询语言,语法相似于SQL,能够直接使用实体类及属性。java

使用HQL 能够避免使用JDBC 查询的一些弊端web

不须要再编写繁复的SQL 语句,针对实体类及其属性进行查询数据库

查询结果是直接存放在List 中的对象,不须要再次封装数组

独立于数据库,对不一样的数据库根据Hibernate dialect 属性的配置自动生成不一样的SQL 语句执行session

 

1、语法:函数

    select/update/delete……] from Entity [where……] [group by……] [having……] [order by……]测试

其中:蓝色标记的部分为必须书写的spa

2、基础查询hibernate

1)  HQL语法相似于SQL,有SQL的关键词select、from、order by、count()、where等。设计

2)  不一样的是HQL是一种彻底面向对象的语言,可以直接查询实体类及属性

3)HQL语法相似于SQL,是一种select ... from结构。其中,from后跟的是实体类名,而不是表名。select后面跟的能够是实体对象,也能够是实体对象的属性或者其余的值。如:

Query query = session.createQuery("select c from Cat as c"); //查询全部的Cat

List<Cat> catList = query.list(); //执行查询,返回List

其中Cat为实体类Cat,c为Cat对象,关键词as用法同SQL,能够省略。Query是Hibernate的查询对象,query.list()将以List类型返回查询结果,上面代码也能够简写为:

Query query = session.createQuery("from Cat"); //查询全部的Cat

List<Cat> catList = query.list(); //执行查询,返回List

3、返回类型

Hiberante使用Query对象进行查询。Session的createQuery()方法可以建立Query实例,参数为HQL。Query对象可以返回各类类型的查询结构,例如:long、、String、List<实体类>、List<Map>、POJO等。

【下述为类型】

3.1 返回类型--查询单个对象

Query的unique()返回单个对象。使用unique()获取返回值时,HQL语句查询到的结果最多只能有一个,若是结果多于一个,unique()方法会抛出异常。若是没有,会返回null。这个方法经常用来查询记录总数,由于总会返回一个对象,而且也只有一个。

如:

Query q =session.createQuery("select count(c) from Cat c"); //建立查询对象

Number num = (Number)q.uniqueResult(); //返回单个实例

int count = num.inValue(); //返回数值

 

3.2 返回类型--返回集合属性

Query的list()方法是最经常使用的方法。实际上,unique()方法也是在list()方法获得返回数据后执行的。list()老是返回一个java.util.List对象,里面有0个或多个值。list()能够返回实体对象,也能够返回实体对象的某个属性或某些属性。

如:

List<Cat> catList = session.createQuery("select c from Cat c").list();  //返回存储Cat对象的List

List<String> nameList = session.createQuery("select c.name from Cat c").list(); //返回存储猫名字(String类型)的List  
 
List<String[]> nameList=session.createQuery("select c.name, c.mother.name from Cat c").list();  //返回猫名字、猫妈妈名字的字符串数组(String[]类型)的List

List<Cat> motherList = session.createQuery("select c.mother from Cat c"); //返回猫妈妈的List,虽然是Cat的一个属性,但仍然是Cat类型

 

3.3 同时返回多个对象

Query的list()方法返回java.util.List对象。List中通常存储完整的实体类对象。如select c from Cat c,会将全部的Cat都查询出来,包含Cat类全部即时加载的属性。

对于有些查询,只须要查几个属性就能够了,这时候能够在HQL中指定要返回的部分。查询部分属性时,返回结果仍然是List类型,里面多是单个的Object,也多是Object[]数组,还多是List对象或Map对象。返回什么类型数据,由HQL语句决定。

 

3.4 同时返回多个对象--返回Object[]数组

查询多个属性时,Hibernate将同时返回多个对象(以Object[]对象类型返回)。返回的数组是放到List<Object[]>中的,获得返回数组须要遍历List对象。

如:

List<Object[]> list = session.createQuery("select c.name,c.mother.name, c.createDate from Cat c").list(); //返回list

for(Object[] row:list){ //遍历第1层的list

 for(Object obj:row){ //遍历第2层的数组

 System.out.println(""+obj); //输出Object

 }

}

 

3.5 同时返回多个对象--返回List类型

返回结果还能够放到List<List>中。查询时HQL采用“select new List(a,b,c) from ...”的形式。一样须要遍历List来获取返回的List,再遍历返回的List获取查询结果。

如:

List<List> list = session.createQuery("select new List( c.name,c.mother, c.createDate) from Cat c").list(); //关键词List

for(List row:list){ //遍历第1层的list

 for(Object obj:row){ //遍历第2层的数组

 System.out.println(""+obj); //输出Object

 }

}

 

3.6 同时返回多个对象-- 返回Map类型

更实用的是返回Map类型。Map中将包含查询的列名、值。遍历List<Map>得到Map,从Map中直接取值就能够了,或者遍历Map。

如:

List listMap = session.createQuery("select new Map( c.name as name,c.mother as mother, c.createDate as createDate) from Cat c").list(); //关键词List


for(Map map:(List<Map>)listMap)){ //遍历第1层的list

     System.out.println("name:"+map.get("name"));
 
    System.out.println("Mother:"+map.get("mother"));

    System.out.println("CreateDate:"+map.get("createDate"));

}

 

3.7 同时返回多个对象--返回Java实体对象

对于只查询部分属性的查询,返回数组、List、Map时,很方便,可是操做Object[]数组、List、Map等不如操做实体对象方便。实际上查询部分属性时,也能够返回实体对象。HQL中也可使用构造函数。

如:

List<Cat> catList=session.createQuery("select new Cat(cat.name, cat.createDate) from Cat c").list();

这样使用时,Cat类必须存在 一个public Cat(String name, Date createDate)的构造函数。由于Hibernate是经过该构造函数完成返回值从Object[]数组转化到Cat实体类的。

 

4、使用MyEclipse建立使用Hibernate应用

 1 . 新建数据库,完成相关表的创建,而后而且建立外键,本次案例的外键为:

image

【附:数据库相关表】

image

image

2. 在MyEclipse中选择MyEclipse Database Explorer,与当前数据库创建连接

image(因为个人数据库已经创建了,因此我只把信息的截图列出来)

 

3.在项目中建立Hibernate

 

QQ截图20150606144612QQ截图20150606144643QQ截图20150606144722QQ截图20150606144746

 

4.在MyEclipse Database Explorer建立映射

 

QQ截图20150606144838QQ截图20150606144903QQ截图20150606144929

 

5.修改相关xml文件

 

QQ截图20150606145036

注:删除掉系统创建的TbCat.hbm.xml和TbCatMother.hbm.xml中的catlog,是为了让系统数据库管理数据库信息,而不是让代码管理数据库信息

 

6.建立测试类

     6.1 查询宠物表中的信息

package cn.edu.bzu.test;

import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;

import cn.edu.bzu.dao.HibernateSessionFactory;
import cn.edu.bzu.entity.TbCat;

public class test {
    public static void main(String args[]){
        Session session=HibernateSessionFactory.getSession();  //经过HibernateSessionFactory获得session对象
        
        Query q=session.createQuery("from TbCat");   //建立查询
        List<TbCat>  list=q.list();  //获得查询的值,查询的值为一个List集合
        
        for(TbCat cat:list){  //进行数据遍历
            System.out.println("Name: "+cat.getName()+",Description: "+cat.getDescription()+"CreateDate: "+cat.getCreateDate());
            
        }
        
    }
}

结果:

image

 

6.2  查询宠物的妈妈以及其孩子的信息

package cn.edu.bzu.test;

import java.util.List;
import java.util.Set;

import org.hibernate.Query;
import org.hibernate.Session;

import cn.edu.bzu.dao.HibernateSessionFactory;
import cn.edu.bzu.entity.TbCat;
import cn.edu.bzu.entity.TbCatMother;

public class TestMother {
    public static void main(String args[]){
        Session session=HibernateSessionFactory.getSession();
        
        Query q=session.createQuery("from TbCatMother");
        
        List<TbCatMother> list=q.list();  //取得全部母亲的信息
        
        for(TbCatMother mother:list){
            System.out.println("The Mother is " +mother.getName());
            System.out.println("---------------");
            System.out.println(mother.getName()+"'s Child are ");
            Set myset=mother.getTbCats();  //返回一个set对象
            Object[] array_cat=myset.toArray();  //将set对象转换为数组的形式
            for(int i=0;i<array_cat.length;i++){
                TbCat tbCat=(TbCat) array_cat[i]; //取得一行的cat数据
                System.out.println("Name: "+tbCat.getName()+" Description: "+tbCat.getDescription());
            }
        }
        
    }
}

  结果:

image

 

7.总结

7.1  建立数据库,创建相关表

7.2  建立web project ,而且在MyEclipse Database Explorer 中创建相关数据库链接

7.3  添加Hibernate,完成相关设计

7.4  在MyEclipse Database Explorer中为相关的表创建映射关系,并修改相关表的xml文件中的属性,本案例修改的catlog属性

7.5  创建相关测试类,测试数据查询等操做

 

8.相关资料下载

8.1  Hibernate查询语言HQL

相关文章
相关标签/搜索