HIBERNATE对原生SQL的处理

来源:互联网 发布:四川航天金穗Java开发 编辑:程序博客网 时间:2024/06/06 18:48
对原生SQL查询执行的控制是通过SQLQuery接口进行的,通过执行Session.createSQLQuery()获取这个接口。最简单的情况下,我们可以采用以下形式:List cats = sess.createSQLQuery("select * from cats")    .addEntity(Cat.class)    .list();这个查询指定了:SQL查询字符串查询返回的实体这里,结果集字段名被假设为与映射文件中指明的字段名相同。对于连接了多个表的查询,这就可能造成问题,因为可能在多个表中出现同样名字的字段。下面的方法就可以避免字段名重复的问题:List cats = sess.createSQLQuery("select {cat.*} from cats cat")    .addEntity("cat", Cat.class)    .list();这个查询指定了: SQL查询语句,它带一个占位符,可以让Hibernate使用字段的别名. 查询返回的实体,和它的SQL表的别名. addEntity()方法将SQL表的别名和实体类联系起来,并且确定查询结果集的形态。 addJoin()方法可以被用于载入其他的实体和集合的关联. List cats = sess.createSQLQuery(        "select {cat.*}, {kitten.*} from cats cat, cats kitten where kitten.mother = cat.id"    )    .addEntity("cat", Cat.class)    .addJoin("kitten", "cat.kittens")    .list();原生的SQL查询可能返回一个简单的标量值或者一个标量和实体的结合体。 Double max = (Double) sess.createSQLQuery("select max(cat.weight) as maxWeight from cats cat")        .addScalar("maxWeight", Hibernate.DOUBLE);        .uniqueResult();除此之外,你还可以在你的hbm文件中描述结果集映射信息,在查询中使用。List cats = sess.createSQLQuery(        "select {cat.*}, {kitten.*} from cats cat, cats kitten where kitten.mother = cat.id"    )    .setResultSetMapping("catAndKitten")    .list();
原创粉丝点击