Hibernate之SQL查询

Hibernate支持使用原生的SQL语句进行查询。使用原生的SQL的好处是:可以利用某些数据库的特性(不同的数据库SQL 语法会有所差异),

将原有的使用JDBC作为持久层技术的应用 ,迁移到使用Hibernate作为持久层技术。

我们知道 使用HQL查询 主要牵涉的是 Query接口,而使用SQL查询 主要牵涉的 是 SQLQuery接口  。

而SQLQuery接口 是 Query接口的子接口。

所以 Query接口中的方法 ,均可以在SQLQuery接口中使用 ,SQLQuery接口还多了如下两个方法:

addEntity():    将查询到的 记录  与  持久化类实体 关联

addScalar():    将查询到的 记录的列的值 关联 成 标量值。

据此 SQL查询可以分为 实体查询 和 标量查询

1.标量查询

session.createSQLQuery(String  sql)   查询出来的结果表的 一条记录的列的值 封装成 一个 Object[]  数组。

然后使用list()方法,得到存有N个Object[] 数组 的list集合。

如果查询的结果表 的记录只有一个列,那么就不会封装成为Object[]数组,因为没有必要。这时调用list()方法,会得到直接存有记录列值的list集合。

在调用list()方法 ,封装成集合之前 ,可以调用addScalar()方法进行 ,明确返回值类型的处理。例子:

 @Test
    public void testSQL()
    {
        String sql = "select t.name, t.age , t.birthday from tb_person as t";
        SQLQuery sqlquery= session.createSQLQuery(sql)
                                  .addScalar("name", StandardBasicTypes.STRING)
                                  .addScalar("age", StandardBasicTypes.INTEGER)
                                  .addScalar("birthday", StandardBasicTypes.DATE);      //如果在使用addScalar()方法时,没有包含某列,则该列不会出现在Object[]数组中,尽管已经查出了该列
        List<Object[]> list = sqlquery.list();
        for(int i = 0 ; i < list.size() ; i++)
        {
            Object[] objArray = list.get(i);
            for(int j = 0 ; j < objArray.length ; i++)
            {
                System.out.println("第"+i+"条记录的列的值:"+ objArray[j]);
            }
        }

    }

标量查询中 ,addScalar()方法有两个作用:
指定查询结果包含哪些数据列 -------没有被addScalar()选出的数据列不会包含在最终查询结果中

指定查询结果中数据列的数据类型

2.实体查询

如果查询返回某个数据表的全部数据列(记住:是选出全部数据列,包括通过外键关联存在从表中的属于这条记录的列),且该数据表有对应的持久化类映射,

我们就可以将查询结果转化为实体查询。

单表情况,即一个持久化类的属性 通过一张表来存储。例子:

@Test
    public void testSQLEntity()
    {
        //持久化Person类  有三个属性 name ,age ,bithday
        String sql  = "select t.* from tb_person as t where t.id = :id ";

        SQLQuery sqlquery = (SQLQuery) session.createSQLQuery(sql)
                                              .addEntity(Person.class)   //将查询的行记录 转化为 类实体对象
                                              .setInteger("id", 99);     // sql绑定参数
        List<Person> list = sqlquery.list();       //每一条记录封装成 一个Person类的实例对象 ,放在list集合中  

        for(int i = 0 ; i < list.size() ; i++)
        {
            Person  p  = (Person)list.get(i);
            System.out.println("第"+i+"个对象的name属性:" + p.getName() );
            System.out.println("第"+i+"个对象的age属性:" + p.getAge() );
            System.out.println("第"+i+"个对象的bithday属性:" + p.getBirthday() );
        }
    }

多表关联的情况, 如持久化类有集合类型的属性 ,等映射成多表 。例子:

 @Test
    public void testSQLEntity()
    {
        //持久化Person类  有四个属性 name ,age ,bithday , List<House>
        String sql  = "select p.* , h.* from tb_person as p , tb_house as h where p.id = h.id and p.id = :id ";   //tb_person表 与 tb_house通过既是主键又是外键的 tb_house的id关联

        SQLQuery sqlquery = (SQLQuery) session.createSQLQuery(sql)
                                              .addEntity(Person.class)   //将查询的行记录 的前部分列转化为 Person类实体对象
                                              .addEntity(House.class)    //将查询的行记录 转后部分列化为House类实体对象
                                              .setInteger("id", 99);     // sql绑定参数
        List<Object[]> list = sqlquery.list();       //每一条记录封装成 一个Person类的实例对象和一个House类的实例对象,放在一个Object[]数组中 ,多个Object数组,放在list集合中  

    }

命名SQL查询:

类似于命名HQL查询

时间: 2024-08-07 00:11:59

Hibernate之SQL查询的相关文章

使用hibernate原生sql查询,结果集全为1的问题解决

问题如下: String sqlTest ="select summary,summaryno from F_Summary"; List<Map<Object, Object>> listTest = this.getService().getListBySql(sqlTest); for (Map<Object, Object> m : listTest) { for (Object k : m.keySet()) { System.out.pr

Hibernate应用SQL查询返回实体类型

Hibernate应用SQL查询返回实体类型 Hibernate使用SQL查询返回实体类型 以前,使用SQL查询,结果放在 RS 结果集中,还要去转换影射到Java类中.Hibernate中,可以自动帮我们注入到Hibernate 甚至是 非 Hibernate 类型当中. String sql = "select * from T_TMP_PUBLIC_POLICY TP"; SQLQuery sqluery = session.createSQLQuery(sql).addEnti

关于用Hibernate执行sql查询,字符字段类型只返回第一个字节的问题

关于用Hibernate执行sql查询,字符字段类型只返回第一个字节的问题 今天遇到了一个问题,就是在Hibernate中,我用sql去查询mysql数据库里面的user表里面的username字段,但是发现查出来的数据都是只有第一个字,例如:在user表里面的username字段中有一条数据是:"Chen chiwei",查询后返回的结果却是这条数据的第一个字母:"C":于是乎,我查了一下user这张表的设计,发现username这个字段的类型是'char'类型,

Hibernate原生SQL查询多表关联,SQL语句要注意的问题

Hibernate原生SQL查询多表关联,SQL语句要注意的问题 @for&ever 2009-9-4 系统环境: MySQL5.1 Hibernate3.3 有如下的假定: 实体类 Question 和 Answer分别对应数据表 question 和answer. 并且表 question 和answer 的字段大部分都一样,字段数目也一样. 执行如下的操作: 1> 使用hibernate 使用原生SQL查询, Query q = session.createSQLQuery(sql).

关于hibernate纯sql查询返回结果集的问题(hbm.xml中不写多表关联)

相信用过hibernate的兄弟们都会因为多表复杂查询后,为返回的结果如何组装到一个VO中而烦恼不已.我也不停的为此而烦恼,但是在看了hibernate的transform后,感觉这个方法还挺管用的.      例如现在有两张表,一张是user表,放了一些用户的信息,另外一张表是用户发表的帖子,里边有一个user的外键.我们需要查询出来,某个人发布的帖子,sql如下: Java代码  select u.userName,p.title,p.addTime from user as u,post

Hibernate动态SQL查询

一.需求背景 给hibernate插上ibatis动态查询的翅膀,既保留crud的简洁性,又能收获ibatis的特性. 二.ibatis的动态查询 1 <select id="findUser" resultClass="User"> 2 SELECT * From User 3 <dynamic prepend="WHERE"> 4 <isNull property="id"> 5 id

Hibernate用Sql查询封装到实体类

Hql查询语句可以自动封装到实体类中,但是sql语句需要用到方法才可以 1 @Override 2 @SuppressWarnings("unchecked") 3 public <T> Pagination<T> getPageResultObjectParamsBySql(Class<T> clazz, 4 String hql, int pageNo, int pageSize, 5 Object[] param) 6 throws Runti

hibernate 使用sql 查询(setResultTransformer)

使用方法举例如下: public List findByOid(Object oid) {  log.debug("finding all WatershedAnalyse instances");  Session session=getSessionFactory().openSession();  SQLQuery query=null;  try {   String queryString = "SELECT oid,bdatetime,basin_code,p,e

hibernate sql查询后对象转换成实体类

在多表查询的时候使用hibernate的sql查询的时候,一般返回的是object[]数组,或者可以使用 session.createSQLQuery(sql).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);     session. session.createSQLQuery(sql).addEntity(entity.class); /**     * 分页查询sql,sql语句不包含起始记录数和查询记录数     * @pa