Hibernate 笔记 HQL查询(一)单属性,多属性查询

HQL是Hiberante官方推荐的Hibernate检索方式,它使用类似SQL的查询语言,以面向对象的方式从数据库中查询。可以使用HQL查询具有继承、多态和关联关系的数据。在检索数据时应优先考虑使用HQL方式。

本笔记将会沿用前面所使用的dept部门表,emp员工表。

dept部门表

emp员工表

1 查询实体

     hibernate的session.createQuery()方法是使用HQL语句查询对象的。

     hql:是查询对象的,例如:"from User",其中from不区分大小写,而User是区分大小写,因为它是对象。是User类

     返回Query对象。

     执行这条语句后,Hibernate会根据配置文件中所配置的数据库适配器自动生成相应数据库的SQL语句。

sql: select * from dept;     from 后面是表名

hql: form Dept;    from 后面是类。

可以对类起别名,有两种方法。

hql: from Dept d

hql:from Dept as d

以上两种起别名方法皆可。

public void Test1() throws Exception{   
Configuration config=new Configuration().configure();
SessionFactory sessionFactory= config.buildSessionFactory();
Session session=null;
Transaction tr=null;
try{
session= sessionFactory.openSession();
tr=session.beginTransaction();
String hql="from Dept"; //定义String类型hql,写入hql语句。
Query query=session.createQuery(hql);

List<Dept> list = query.list();
for(Dept dept:list){
System.out.print("部门编号: "+dept.getDid() +" ");
System.out.println("部门名称: "+dept.getDname());

}
tr.commit();
}catch(Exception e){
tr.rollback();
}finally{
if(session!=null){
session.close();
}
if(sessionFactory!=null){
sessionFactory.close();
}
}
}

执行结果

Hibernate: select dept0_.did as did1_, dept0_.dname as dname1_, dept0_.daddress as daddress1_ from dept dept0_
部门编号:  1   部门名称:   业务部
部门编号:  2   部门名称:   技术部
部门编号:  3   部门名称:   管理部
部门编号:  4   部门名称:   财务部
部门编号:  5   部门名称:   人力资源部

 

2  查询表中单个属性

sql: select ename from dept

hql: select ename from Dept

对属性也可以设置别名

hql:select ename as from Dept

as 必须加。

    public void Test2() throws Exception{ 
Configuration config=new Configuration().configure();
SessionFactory sessionFactory= config.buildSessionFactory();
Session session=null;
Transaction tr=null;
try{
session= sessionFactory.openSession();
tr=session.beginTransaction();
Query query=session.createQuery("select dname from Dept");
List<String> list = query.list();
for(String name:list){
System.out.println("部门名称: "+name);
}
tr.commit();
}catch(Exception e){
tr.rollback();
}finally{
if(session!=null){
session.close();
}
if(sessionFactory!=null){
sessionFactory.close();
}
}
}

 

 执行结果

Hibernate: select dept0_.dname as col_0_0_ from dept dept0_
部门名称: 业务部
部门名称: 技术部
部门名称: 管理部
部门名称: 财务部
部门名称: 人力资源部

3  对多个属性进行查询

sql: select ename,eage from emp

hql:select ename,eage from Emp

hql: select e.ename,e.eage from Emp e

以上两种hql写法均可。

public void Test3() throws Exception{
Configuration config=new Configuration().configure();
SessionFactory sessionFactory= config.buildSessionFactory();
Session session=null;
Transaction tr=null;
try{
session= sessionFactory.openSession();
tr=session.beginTransaction();
Query query=session.createQuery("select ename,eage from Emp");
List<Object[]> list = query.list(); //对多个属性查询的时候,使用Obejct数组。

for(Object[] message:list){
System.out.println(Arrays.toString(message)); //采用辅助类Arrays的toString()方法打印数组。
}
tr.commit();
}catch(Exception e){
tr.rollback();
}finally{
if(session!=null){
session.close();
}
if(sessionFactory!=null){
sessionFactory.close();
}
}
}

 

测试结果

Hibernate: select emp0_.ename as col_0_0_, emp0_.eage as col_1_0_ from emp emp0_
[刘德华, 40]
[李世民, 34]
[曹操, 59]
[和珅, 44]
[贺龙, 45]
[郭富城, 34]

4 通过实体类方式查询多属性

除了上述方法外,还可以采用实体类的方式查询,要在Emp类中加入带有查询参数的构造器,代码如下。

public class Emp {
private int eid;

private int eage;

private float esal;
private String ename;
   省略get,set方法。


public Emp() {
super();
}
public Emp(int eage, String ename) { //需要查询的属性是什么,构造器的参数就是什么。
super();
this.eage = eage;
this.ename = ename;
}

 

 

测试类

public void Test4() throws Exception{ 
Configuration config=new Configuration().configure();
SessionFactory sessionFactory= config.buildSessionFactory();
Session session=null;
Transaction tr=null;
try{
session= sessionFactory.openSession();
tr=session.beginTransaction();
Query query=session.createQuery("select new Emp(eage,ename) from Emp e"); select 后直接调用构造器,参数就是查询的属性,参数不可错乱。
List<Emp> list = query.list(); 此处不实用object数组,类类型即可
for(Emp message:list){
System.out.print("姓名:"+message.getEname()+" ");
System.out.println("年龄:"+message.getEage());
}
tr.commit();
}catch(Exception e){
tr.rollback();
}finally{
if(session!=null){
session.close();
}
if(sessionFactory!=null){
sessionFactory.close();
}
}
}

测试结果

Hibernate: select emp0_.eage as col_0_0_, emp0_.ename as col_1_0_ from emp emp0_
姓名:刘德华  年龄:40
姓名:李世民  年龄:34
姓名:曹操  年龄:59
姓名:和珅  年龄:44
姓名:贺龙  年龄:45
姓名:郭富城  年龄:34

posted @ 2011-11-05 16:28  蓝冰竹斋  阅读(12045)  评论(1编辑  收藏  举报