在多表查询的时候使用hibernate的sql查询的时候,一般返回的是object[]数组,或者可以使用
session.createSQLQuery(sql).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
来转化为map来进行处理,可以通过以下方式将查询结果转化为实体类:
1,sql语句 String sql="select s.id as id,s.classname as classname from grade s,student st where s.id=st.classid"
利用以下语句
session.createSQLQuery(sql) .setResultTransformer(Transformers.aliasToBean(Grade.class))可以将sql中查询出来的字段转化为班级这个实体类,但是必须为每个字段指定别名,别名就是班级类里面的对应的属性,但必须注意,对每一个列都必须addScalar("列名"),如果不设置addScalar方法可能会报转型错误的异常.如果查询的结果里面包括多个表里面的字段,不能对应一个实体类去接受,就需要新建一个与查询结果对应的实体类,或者直接使用map结果集
2,sql语句 String sql="select {s.*} from grade s,student st where s.id=st.classid"
针对这样的全部字段查询的sql可以利用addEntity来转化为实体类
SQLQuery query=session.createSQLQuery(sql) ;
query.addEntity("s", Grade.class);
SQL查询语句,它带一个占位符,可以让Hibernate使用字段的别名.
查询返回的实体,和它的SQL表的别名.
addEntity()方法将SQL表的别名和实体类联系起来,并且确定查询结果集的形态。
这样就可以将班级这张表里面的所有字段的值赋值给班级这个实体类java培训机构排名,而且必须是所有的属性
3,sql语句 String sql="select {s.*},{st.*} from grade s,student st where s.id=st.classid"
SQLQuery query=session.createSQLQuery(sql) ;
query.addEntity("s", Grade.class);
query.addEntity("st", Student.class);
利用这样的查询得到的是一个object[]数组,object[0]就是班级实体类,object[1]就是学生实体类
可以用addScalar(String arg,Type type)方法定义要返回的字段类型,如
s.createSQLQuery(shuiQingHQL).addScalar("STCD",Hibernate.STRING).addScalar("STNM")
给你这样说吧:hibernate提供了多种查询数据的方法。通常情况下,使用select子句查询的结果是集合,而集合元素就是select后的实例、属性等组成的数组。
在特殊情况下,如果select后只有一项(包括持久化实例或属性),则查询到元素就是该持久化实例或者属性。
如果select后多个项,则每个集合元素就是选择出的多项组成的数组!
这就是原理,在您使用“用createnativequery(sql,object.class).getresultlist 带个对象类型就行 ”这个就行是应该知道其中的原理。
用户登录
还没有账号?立即注册
用户注册
投稿取消
文章分类: |
|
还能输入300字
上传中....