• Hibernate执行原生SQL返回List<Map>类型结果集


    我是学java出身的,web是我主要一块;

    在做项目的时候最让人别扭的就是hibernate查询大都是查询出List<T>(T指代对应实体类)类型

    如果这时候我用的联合查询,那么返回都就是List<Object[]> , 这样的结果集让我苦恼了很久,

    于是我萌发了使用spring提供的JdbcTemlate来 查询出 List<Map<String,Object>>的念头,

    方法虽然可行,可惜的是spring偌大一个框架,居然不提供jdbc分页。。。。

    无奈之下我又重新回归hibernate,找了很久,终于发现hibernate原来是可以查询出List<Map<String,Object>>类型的结果集

    1.2、query.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);

    Query 和 SQLQuery都可以使用别名,将查询出来的记录转化成为map

    SQLQuery执行出来是{name1: value1, name2: value2}

    但是Query 例如语句: select o.name1, o.name2 from Object o

    执行出来的却不是想象中的那样而且{0:value1, 1: value2}

    import org.hibernate.criterion.CriteriaSpecification;
    import org.hibernate.transform.ResultTransformer;
    import org.hibernate.Session;
    import org.hibernate.Query;

    最近在学习hibernate 以下代码功能:Hibernate执行原生SQL返回List类型结果集
    //获得session对象 Session session = super.getSession(); //创建sql语句 String sql = "SELECT users.name,usersinfo.* FROM users,usersinfo WHERE users.id = usersinfo.userid"; //获得SQLQuery对象 SQLQuery query = session.createSQLQuery(sql); //设定结果结果集中的每个对象为Map类型 query.setResultTransformer(CriteriaSpecification.ALIAS_TO_ENTITY_MAP); //执行查询 List list = query.list(); //释放session releaseSession(session);
    在使用hibernate进行查询时,使用得最多的还是通过构建hql进行查询了。在查询的过程当中,除使用经常的查询对象方法之外,还会遇到查询一个属性,或一组聚集结果的情况。在这种情况下,我们通常就需要对返回的结构进行处理。
    一般情况下,我们通过构建hql,并通过设置query的resultTransformer来定制返回结果的类型,一般设置为map属性,如下所示:
    Query query = session.createQuery("hql");?
    query.setResultTransformer(CriteriaSpecification.ALIAS_TO_ENTITY_MAP);
    来指定查询结果的每一项为一个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的查询语句和查询结果:
    使用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,四川]]
    
    ?
    使用Map,首先不指定alias,则结果的键就按照查询出来的顺序结果,使用0,1来表示key
    String query = "select new Map(p.code, p.value) from Dictionary p";
    
    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}]
    
    --------------------------------------------------------------------------------------------------
    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支持p.name, p.address的构造函数,
    
    select new Map(p.name as personName) from Person as p ;
    select将选中的表达式命名为别名,这种用法与new Map()结合,选择出来的是Map结构,
    以personName为key,将实际选择出来的值作为value

    资料整合自:http://blog.sina.com.cn/s/blog_a298547c0101bk58.html

  • 相关阅读:
    严蔚敏数据结构线性表操作
    strcpy/strncpy、strcat/strncpy的替代方案strlcpy,strlcat
    使用DNS的反向区域,解决通过IP反向查询主机名,适合web环境通过IP定位故障主机名
    FreeBSD漏洞程序升级
    定义制造业操作(定义 MES/MOM 系统)
    定义制造业操作(定义 MES/MOM 系统)
    EF / EF CORE 打印SQL
    远程连接桌面Azure AD(Azure AD Joined Computer)
    《精通CSS第3版》(6)Flexbox
    FastNat内网穿透,给开发人员送的硬货福利限时送
  • 原文地址:https://www.cnblogs.com/apem/p/3502039.html
Copyright © 2020-2023  润新知