zoukankan      html  css  js  c++  java
  • hibernate总结一

    在hibernate中查询使用List,Map和类对象定制返回类型

     
      在使用hibernate进行查询时,使用得最多的还是通过构建hql进行查询了。在查询的过程当中,除使用经常的查询对象方法之外,还会遇到查询一个属性,或一组聚集结果的情况。在这种情况下,我们通常就需要对返回的结构进行处理。
    一般情况下,我们通过构建hql,并通过设置query的resultTransformer来定制返回结果的类型,一般设置为map属性,如下所示、来指定查询结果的每一项为一个map。:

    Query query = session.createQuery("hql"); query.setResultTransformer(CriteriaSpecification.ALIAS_TO_ENTITY_MAP);
     

        不过,随着hibernate的发展,可以在hql中直接使用集合查询语句,如list和map了。以下分别介绍使用List和Map时的查询语句以及查询结果。首先,数据库的数据如下所示:

    mysql> select * from p_dictionary; +-----------------+----+---------+------+--------+--------+ | dictionary_type | id | version | code | forbid | value | +-----------------+----+---------+------+--------+--------+ | COUNTY | 1 | 0 | 001 | | 四川 | | COUNTY | 2 | 0 | 002 | | 北京 | | COUNTY | 3 | 0 | 001 | NULL | 四川 | +-----------------+----+---------+------+--------+--------+ 3 rows in set (0.00 sec)

    以下分别介绍使用list和map的查询语句和查询结果:

    A、使用List


    String query = "select new List(p.code, p.value) from Dictionary p"; List list = session.createQuery(query).list(); System.out.println(list);
    //结果: [[001, 四川],[002,北京],[001,四川]]

     采用list方法查询的返回结果为一个List,该List中封装的对象分为以下三种情况:

      1.查询全部字段的情况下,如"from 实体类",list中封装的对象为实体类本身,各属性都将得到填充。

      2.只查询一个字段,默认情况下,list中封装的是Object对象。

      3.查询两个或两个以上的字段,默认情况下,list中封装的是Object[],长度与所查询的字段数一致。

     
    B、使用Map,
      首先不指定alias(别名),则结果的键就按照查询出来的顺序结果,使用0,1来表示key:

    String query = "select new Map(p.code, p.value) from Dictionary p"; //完全面向对象,使用java中的new Map List list = session.createQuery(query).list();
    //结果:[{1=四川, 0=001},{1=北京, 0=002},{1=四川, 0=001}

      使用Map,指定alias,则结果中的key则为alias,和实体类中字段对应着

    String query = "select new Map(p.code as code, p.value as value) from Dictionary p"; List list = session.createQuery(query).list();
    //结果:[{value=四川, code=001},{value=北京, code=002},{value=四川, code=001}

      如果部分使用alias,部分不使用,则使用了alias的将使用alias作为key,没有使用的则仍然使用序号代替,其中序号则为在查询结果的序号


    String query = "select new Map(p.code as code, p.value) from Dictionary p"; List list = session.createQuery(query).list(); //结果:[{1=四川, code=001},{1=北京, code=002},{1=四川, code=001}]

    C、Others

    --------------------------------------------------------------------------------------------------
    select new List(p.name, p.address) from Person as p ;
    //select将选择出来的属性存入一个List对象中
    
    select new ClassTest(p.name, p.address) from Person as p;
    //select将选择出来的属性封装成对象,前提是ClassTest支持ClassTest(p.name, p.address)的构造函数:)
    
    select new Map(p.name as personName) from Person as p ;
    //select将选中的表达式命名为别名,这种用法与new Map()结合,选择出来的是Map结构,
    //以personName为key,将实际选择出来的值作为value

    --------------------------------------------------------------------------------------------------

    D、One More Thing

      相信用过hibernate的兄弟们都会因为多表复杂查询后,为返回的结果如何组装到一个VO中而烦恼不已。我也不停的为此而烦恼,但是在看了hibernate的transform后,感觉这个方法还挺管用的。

      假设我们现在有一个DTO,其属性包括两张表的属性,我们现在需要将sql语句(不是Hql语句哦:)查询得到的内容转为一个DTO对象,其解决方法如下: 

      

    //sql语句
    String sql = "select u.userName as userName, p.title as title, p.addTime as addTime from user as u,post as p where u.id=p.userId" //PostVO类,里边放着了用户的信息和帖子的信息的属性,设置getset方法,务必保证这个类里边有一个默认的构造函数。 Query q = getCurrentSession().createSQLQuery(sql).setResultTransformer(Transformers.aliasToBean(PostVO.class));

      可以看下hibernate这一部分的源码就会发现,主要是使用了AliasToBeanResultTransformer这个类,通过sql的 查询,会返回数组,然后hibernate根据数据表的映射,自动帮我们来set对应的字段属性,所以标红的部分务必要跟VO中的属性值一致,要不然会报错的。 如果需要的话,大家也可以重写这个类。例如VOResultTransformer。然后在dao中更改成


    setResultTransformer(new VOResultTransformer(PostVO.class));

    ps:

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

    参考文章:) hibernate-hql-createquery-list-type-cast-to-model-directly

                 

    //add
    //使用了包名 com.example.DTO
    List<DTO> dtos = session.createQuery("SELECT NEW com.example.DTO( p.name, o.name) FROM Entity o").list();

     

    你以为躲起来就找不到你了吗?没有用的!象你这样出色的男人,无论在什么地方,都像漆黑中的萤火虫一样,那样的鲜明,那样的出众。你那忧郁的眼神,稀嘘的胡喳子,神乎其神的刀法,和那杯Dry Martine,都深深地迷住了我!
  • 相关阅读:
    重写保存按钮save事件
    隐藏列获取不到值,表格选中行提示未选中
    前后台获取上下文context
    editGrid分录表格
    通用查询-高级查询
    js保留位和取整
    在Visual Studio中使用C++创建和使用DLL
    Lua中的一些库(1)
    Lua中的面向对象编程
    Lua中的模块与包
  • 原文地址:https://www.cnblogs.com/wjjFJ/p/5330215.html
Copyright © 2011-2022 走看看