Hibernate原生SQL查询




















































,,,,,,,,从上面可以看出。标量查询中addScalar()方法有两个作用:
,,,,,,,,1,指定查询结果包含哪些数据列- - -没有被addScalar选出的列将不会包含在查询结果中。
,,,,,,,,2、指定查询结果中数据列的数据类型
,
,,,,,,,二、实体查询
,,,,,,,,上面的标量查询返回的标量结果集,也就是从resultset中返回的“裸”数据。如果我们想要的结果是某个对象的实体,这是就可以通过addEntity()方法来实现.addEntity()方法可以讲结果转换为实体。但是在转换的过程中要注意几个问题:
,,,,,,,,1、查询返回的是某个数据表的全部数据列
,,,,,,,,2,该数据表有对应的持久化类映射
,,,,,,,,这时才可以通过addEntity()方法将查询结果转换成实体。
(java),
会话。createSQLQuery (“select * from perons_inf”) .addEntity (Person.class) .list;,
,
会话。createSQLQuery(“选择id、名称、年龄从person_inf”) .addEntity (Person.class) .list ();,
,,,,,,,,这个查询指定:
,,,,,,,,1、SQL查询字符串
,,,,,,,,2,要返回的实体
,,,,,,,,假设人被映射为拥有id、姓名和年龄三个字段的类,以上的两个查询都返回一个列表,每个元素都是一个人实体。
,,,,,,,,假若实体在映射时有一个多对一的关联指向另外一个实体,在查询时必须也返回那个实体(获取映射的外键列),否则会导致发生一个”栏目中未找到的数据库错误。这些附加的字段可以使用*标注来自动返回,但我们希望还是明确指明,看下面这个具有指向老师的多对一的例子:,,
(java),
捐。createSQLQuery(“选择id、名称、年龄、teacherID person_inf”) .addEntity (Person.class) .list ();,
,,,,,,,,这样就可以通过person.getTeacher()获得老师了。
,,,,,,,,,实例:
[html],
公共空间entityQuery () {,
,,会议会话=HibernateUtil.getSession ();,
,,,事务tx=session.beginTransaction ();,
,,,字符串sql=" select * from person_inf ";,
,,,名单列表=session.createSQLQuery (sql)只
,,,,,,,,,,,,,,,addEntity (Person.class)只,,//指定将查询的记录行转换成人实体,
,,,,,,,,,,,,,,,列表(),,,,,,,
,,,(迭代器迭代器=list.iterator (); iterator.hasNext ();) {,
,,,,,,人的人=(人)iterator.next ();,,,,,//集合的每个元素都是一个人对象,
,,,,,,,System.out.println (" name=" + person.getName ());,
,,,,,,,System.out.println(“年龄=" + person.getAge ());,
,
,,,},
,,,tx.commit ();,
,,,session.close ();,
},
,,,,,,,,上面的都是单表查询,如果我们在SQL语句中使用了多表连接,则SQL语句可以选出多个数据表的数据.Hibernate支持将查询结果转换成多个实体。如果要将查询结果转换成多个实体,则SQL字符串中应该为不同数据表指定不同别名,并且调用addEntity()方法将不同数据表转换成不同实体。如下
(java),
公共空间multiEntityQuery () {,
,,会议会话=HibernateUtil.getSession ();,
,,,事务tx=session.beginTransaction ();,
,,,字符串sql="选择p。*, e。*从person_inf p内连接event_inf e“+,
,,,,,,,,,,,,,,,,“person_name=" + person.getName() + "标题=" + event.getTitle ());,
,,,,,,,,,
,,,},
},

,
,,,,,,,,三,处理关联和继承
,,,,,,,,通过提前抓取将活动连接获得,而避免初始化代理带来的额外开销也是可能的。这是通过addJoin()方法进行的,通过这个方法可以讲实体的关联实体转换成查询对象。如下:
(java)
公共空间joinQuery () {,
,,会议会话=HibernateUtil.getSession ();,
,,,事务tx=session.beginTransaction ();,
,,,字符串sql="选择p。*, e。*从person_inf p, event_inf e, e.person_id=p.person_id ";,
,,,名单列表=session.createSQLQuery (sql),
,,,,,,,,,,,,,,,null

Hibernate原生SQL查询