在使用hibernate的时候, 有时需要做一些联表查询, 而有时候需要查询的表在实体中并未做映射关系, 此时使用hsql语句就不太好使了, 就需要用到sql 了, 但是sql查出的结果是Object[] 类型的list, 要封装成实体类的话, 可以用 addEntity
场景一
String sql = select a.*, b.* from A a left join B b where a.a_id = b.a_id
this.currentSession().createSQLQuery(sql)
.addEntity("${a.*}", A.class).addEntity("${b.*}", B.class).list();
这样查出的数组结果中就是对象
场景二
String sql = select a.*, count(b.a_id) as t from A a left join B b where a.a_id = b.a_id group by b.a_id
查询a的数据和b中与a有关的个数
this.currentSession().createSQLQuery(sql)
.addEntity("${a.*}", A.class).addScalar("t", LongType.INSTANCE); //我用的是hibernate4, 网上有的写的是 Hibernate.LONG, 不知道是不是Hibernate3的问题
addScalar 指定的是单列, 如果不添加, 则返回的结果中只有对象, 查到的计数结果将不会返回
场景三(未测试过)
需要查询多个表的字段, 没有数据库和实体的映射, 此时可以写一个实体类, 包含所需要查询的字段, 然后把查询结果封装进去
String sql = select a.id, b.name, c.age from a,b,c
this.currentSession().createSQLQuery(sql)
.addScalar("id", IntegerType.INSTANCE). .addScalar("id", StringType.INSTANCE). .addScalar("id", IntegerType.INSTANCE)'
.setResultTransformer(Transformers.aliasToBean(Person.class)).list()