hibernate sql查询 标量,实体查询

注:原创作品,分享以供交流学习,转载请注明出处

本博文实例假定:
1,student_info是数据库中的一张表的名称。

第一:sql的标量查询(使用addScalar实现)
1,
session.createSQLQuery("select * from student_info").list();

   结果类型:List<Object[]>
   注意:object数组中元素的顺序和类型是hibernate根据ResultSetMetadata
         来判断的(当然一旦访问ResultSetMetadata性能就会大大降低)

2.
session.createSQLQuery("select * from student_info")
   .addScalar("name",StandardBasicTypes.STRING)
   .list();

   结果类型:List<String>
   注意:此时hibernate不会再去根据ResultSetMetadata来获取列信息,而是
         直接从ResultSet中取出name列的值,并把name列的数据类型当成zifu
         串处理,因此即使用了*作为查询的字段列表,但是hibernate查询的
         结果也知识name阻断所组成的列表。

3.
session.createSQLQuery("select * from student_info")
   .addScalar("name")
   .list();

   结果类型:List<String>
   注意:此时hibernate会再去根据ResultSetMetadata来获取列信息,
         从ResultSet中取出name列的值,并根据ResultSetMetadata来确定
         name列的类型。因此这种效率低下,除非是在不知道列的类型,不要
         使用这种类型,尽量使用2的方式。

3.
session.createSQLQuery("select * from student_info")
   .addScalar("name",StandardBasicTypes.STRING)
   .addScalar("student_id",StandardBasicTypes.INTEGER)
   .list();

   结果类型:List<Object[]>
   注意:集合元素中一次存放name,id

总结:addScalar的两个作用:
1,指定查询结果包含哪些数据列(没有被addScalar选出的列不会包含在查询结果中)

1,指定查询结果数据列的数据类型。

第二:sql的实体查询
1.
session.createSQLQuery("select * from student_info")
   .addEntity(Student.class)
   .list();

   结果类型:List<Student>
   注意:要想把结果数据组装成一个对象,必须选出表中的左右的列,如果表中含有
         外键,也必须选择出来,最简单的方法就是用*

2.
session.createSQLQuery("select sf.*,s.* from student_info as sf,student as s
    where sf.id = s.id")
   .addEntity("sf",StudentInfo.class)
   .addEntity("s",Student.class)
   .list();

   结果类型:List<Object[]>
   注意:集合中的元素是StudentInfo,Student组成的数组。











你可能感兴趣的:(Hibernate)