Hibernate中SQL标量查询、实体查询

本博文整理Hibernate中SQL查询的标量查询、实体查询以及处理关联和继承

一:标量查询

[java]  view plain  copy
  1. public void scalarQuery(){  
  2.     Session session=HibernateUtil.currentSession();  
  3.     Transaction tx=session.beginTransaction();  
  4.     String sql="select stu.* from student_inf as stu";  
  5.     List list=session.createSQLQuery(sql)  
  6.             .addScalar("name", StandardBasicTypes.STRING)  
  7.             .addScalar("student_id", StandardBasicTypes.INTEGER)  
  8.             .list();  
  9.     for(Object obj:list){  
  10.         Object[]row=(Object[]) obj;  
  11.         System.out.println(row[0]+"\t"+row[1]);  
  12.     }  
  13.     System.out.println("------------------------------------------");  
  14.     tx.commit();  
  15.     HibernateUtil.closeSession();  
  16.               
  17. }  
标量查询仅仅是查询了部分数据列,像我们上面的程序仅仅查询了student_inf表中的name和student_id两个数据列的值。在返回结果是一个集合,集合的每一个元素都是一个数组,数组元素是name、student_id两列的值。

上面的addScalar()方法有两个作用:

1:指定查询结果包含哪些数据列,没有被addScalar()选中的数据列不会出现在查询结果中,所以查询结果中只能遍历出来name和student_id两个数据列的值。

2:指定查询结果中数据列的数据类型。

二:实体查询:

实体查询与标量查询不同的是:标量查询只是返回一些标量的结果集,而实体查询返回的是数据表中全部数据列。

实体查询的两个条件:
1:查询返回某个数据表的全部数据列,要选出全部数据列(可以在SQL字符串中使用*来表示返回所有列)

2:该数据表有对应的持久化类映射

步骤:利用SQLQuery提供的addEntity()方法,将查询结果转换成实体。

[java]  view plain  copy
  1. public void entityQuery(){  
  2.         Session session=HibernateUtil.currentSession();  
  3.         Transaction tx=session.beginTransaction();  
  4.         String sql="select * from enrolment_inf where year =?1";  
  5.         List list=session.createSQLQuery(sql)  
  6.                 .addEntity(Enrolment.class)  
  7.                 .setInteger("1"2005)  
  8.                 .list();  
  9.         for(Object obj:list){  
  10.             Enrolment e=(Enrolment) obj;  
  11.             System.out.println(e.getStudent().getName()+"\t"+e.getCourse().getName()+"\t\t"+e.getStudent().getId());  
  12.         }  
  13.         System.out.println("------------------------------------------");  
  14.         tx.commit();  
  15.         HibernateUtil.closeSession();  
  16.     }  

  上面这个程序就满足了实体查询的两个条件:SQL语句选出了enrolment_inf表中的全部数据列,而且enrolment_inf表被映射到Enrolment持久化类,所以可以通过addEntity()方法将查询结果转化为了Enrolment实体组成的列表。 

  如果要将查询的结果转化成多个实体,那么SQL字符串应该为不同的数据表指定不同的别名,并调用addEntity("别名",实体类名)方法将不同数据表转化为不同的实体,如下例:

[java]  view plain  copy
  1. public void multiEntityQuery(){  
  2.         Session session= HibernateUtil.currentSession();  
  3.         Transaction tx=session.beginTransaction();  
  4.         String sql="select s.*,e.*,c.* "  
  5.         +"from student_inf s,enrolment_inf e, course_inf c "  
  6.         +"where s.student_id=e.student_id "  
  7.         +"and e.course_code=c.course_code";  
  8.         List list=session.createSQLQuery(sql)  
  9.                 .addEntity("s", Student.class)  
  10.                 .addEntity("e", Enrolment.class)  
  11.                 .addEntity("c", Course.class)  
  12.                 .list();  
  13.         tx.commit();  
  14.         HibernateUtil.closeSession();  
  15.         for(Object obj:list){  
  16.             Object[]objs=(Object[]) obj;  
  17.             Student s=(Student) objs[0];  
  18.             Enrolment e=(Enrolment) objs[1];  
  19.             Course c=(Course) objs[2];  
  20.             System.out.println(s.getName()+"\t"+e.getYear()+"\t"+e.getSemester()+"\t"+c.getName());  
  21.         }  
  22.         System.out.println("------------------------------------------");  
  23.           
  24.     }  

上面的程序SQL语句一次返回了student_inf、course_inf、enrolment_inf表中全部数据,并且都有相应的持久化类映射,因为我们可以将查询结果转换为三个实体,我们首先先将不同的表指定不同的别名,然后再调用addEntity("别名",实体类)方法将从不同表查询到的记录转换为相应的实体。最后返回的查询结果列表,列表中的每个元素都是由Student、Enrolment、Course实体组成的数组。

Hibernate也可以将查询结果转换为非持久化实体(也就是普通的类),但是前提是该类为这些数据列提供了相应的get、set方法,

Query接口提供了一个setResultTransformer()方法,该方法接受一个Transformers对象,通过该对象就可以将查询到的结果转换成普通的JavaBean如下:

[java]  view plain  copy
  1. public void beanQuery(){  
  2.         Session session =HibernateUtil.currentSession();  
  3.         Transaction tx=session.beginTransaction();  
  4.         String sql="select s.name stuName, s.student_id stuId,c.name courseName "  
  5.         +"from student_inf s,enrolment_inf e,course_inf c "  
  6.         +"where s.student_id =e.student_id "  
  7.         +"and e.course_code=c.course_code";  
  8.         List list = session.createSQLQuery(sql)  
  9.                 // 指定将查询的记录行转换成StudentCourse对象  
  10.                 .setResultTransformer(Transformers  
  11.                     .aliasToBean(StudentCourse.class))  
  12.                 .list();  
  13.             // 提交事务,关闭Session  
  14.             tx.commit();  
  15.             HibernateUtil.closeSession();  
  16.             // 因为数据已经全部被选出,故程序可以遍历列表中的数据  
  17.             for (Object ele : list)  
  18.             {  
  19.                 // 每个集合元素都是StudentCourse对象  
  20.                 StudentCourse sc = (StudentCourse)ele;  
  21.                 System.out.println(sc.getStuName() + "\t"+sc.getStuId()+"\t"  
  22.                     + sc.getCourseName());  
  23.             }  
  24.             System.out.println("------------------------------------------");  
以下是StudentCourse类,需要提供上面查询的stuName、stuId、courseName的set、get方法

[java]  view plain  copy
  1. public class StudentCourse {  
  2.     private String stuName;  
  3.     private Integer stuId;  
  4.     private String courseName;  
  5.     public String getStuName() {  
  6.         return stuName;  
  7.     }  
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值