注:原创作品,分享以供交流学习,转载请注明出处
本博文实例假定:
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组成的数组。