hibernate自定义sql关联查询结果组装为对象

简介: hibernate自定义sql关联查询后没有对应的entity,如何映射为对应的bean

hibernate自定义sql关联查询后,结果集如何处理

    public SimplePage<WorkFlowEventDto> listPage(WorkFlowEventDto condition, int start, int limit) {
        StringBuilder selectColumnSql = new StringBuilder("SELECT a.`id` as id,g.name as resourceType,b.name as instanceName,pin.`serial_num` AS instanceNumber," +
                "h.`op_name` as operation,a.status as status,a.`create_time` as createdTime,c.`vm_name` as vmName" +
                ",d.`vdisk_name` as vdiskName,e.`file_sys_name` as fsName");
        StringBuilder selectCountSql = new StringBuilder("select count(a.id)");
        StringBuilder sql = new StringBuilder(
                " FROM work_flow_event a LEFT JOIN resource_instance b ON a.`resourece_instance_id`=b.`id`" +
                " LEFT JOIN product_instance pin ON pin.`id`=b.`product_instance_id`" +
                " LEFT JOIN vm_res_instance c ON b.id=c.`vm_id` LEFT JOIN vdisk_resource_instance d ON b.`id`=d.`vdisk_id`" +
                " LEFT JOIN file_sys_resource_instance e ON b.`id`=e.`file_sys_id` LEFT JOIN resource f ON b.`resource_id`=f.`id`" +
                " LEFT JOIN resource_type g ON f.`type_id`=g.`id` LEFT JOIN work_flow h ON a.event_type=h.op_type WHERE 1=1");

        List<Object> params = new ArrayList<Object>();
        if (condition != null) {
            if (StringUtils.isNotBlank(condition.getInstanceName())) {
                sql.append(" AND b.`name` LIKE ?");
                params.add("%"+condition.getInstanceName()+"%");
            }
            if (StringUtils.isNotBlank(condition.getInstanceNumber())) {
                sql.append(" AND pin.`serial_num` LIKE ?");
                params.add("%"+condition.getInstanceNumber()+"%");
            }
            if (StringUtils.isNotBlank(condition.getCloudosName())) {
                sql.append(" AND (c.`vm_name` LIKE ? OR d.`vdisk_name` LIKE ? OR e.`file_sys_name` LIKE ?)");
                params.add("%"+condition.getCloudosName()+"%");
                params.add("%"+condition.getCloudosName()+"%");
                params.add("%"+condition.getCloudosName()+"%");
            }
            if (StringUtils.isNotBlank(condition.getResourceType())) {
                sql.append(" AND g.`type_number`=?");
                params.add(condition.getResourceType());
            }
            if (condition.getStatus() != null) {
                if(IWorkFlowConstant.WORK_FLOW_STATUS_EXECUTING == condition.getStatus()){
                    sql.append(" and (a.`status` = 2 or a.`status`= 6)");
                }else {
                    sql.append(" and a.`status`=?");
                    params.add(condition.getStatus());
                }
            }
        }
        selectColumnSql.append(sql).append(" ORDER BY a.`create_time` DESC");
        selectCountSql.append(sql);
        SQLQuery q = this.getSession().createSQLQuery(selectColumnSql.toString());
        SQLQuery qc = this.getSession().createSQLQuery(selectCountSql.toString());
        for (int i = 0; i < params.size(); i++) {
            q.setParameter(i, params.get(i));
            qc.setParameter(i, params.get(i));
        }
        q.addScalar("id", Hibernate.INTEGER);
        q.addScalar("resourceType", Hibernate.STRING);
        q.addScalar("instanceName", Hibernate.STRING);
        q.addScalar("instanceNumber", Hibernate.STRING);
        q.addScalar("operation", Hibernate.STRING);
        q.addScalar("status", Hibernate.INTEGER);
        q.addScalar("createdTime", Hibernate.TIMESTAMP);
        q.addScalar("vmName", Hibernate.STRING);
        q.addScalar("vdiskName", Hibernate.STRING);
        q.addScalar("fsName", Hibernate.STRING);
        q.setResultTransformer(Transformers.aliasToBean(WorkFlowEventDto.class));
        List<WorkFlowEventDto> data = q.setMaxResults(limit).setFirstResult(start).list();
        int totalCount = Integer.valueOf(qc.uniqueResult().toString());
        return new SimplePage<WorkFlowEventDto>(data, totalCount);

这是一个按条件分页查询,主要就是用hibernate查询出对象
WorkFlowEventDto不是一个hibernate实体,重要的不是上边那堆,注意看setResultTransformer(Transformers.aliasToBean(WorkFlowEventDto.class))

目录
相关文章
|
4天前
|
SQL 监控 关系型数据库
SQL语句当前及历史信息查询-performance schema的使用
本文介绍了如何使用MySQL的Performance Schema来获取SQL语句的当前和历史执行信息。Performance Schema默认在MySQL 8.0中启用,可以通过查询相关表来获取详细的SQL执行信息,包括当前执行的SQL、历史执行记录和统计汇总信息,从而快速定位和解决性能瓶颈。
|
15天前
|
SQL 存储 缓存
如何优化SQL查询性能?
【10月更文挑战第28天】如何优化SQL查询性能?
60 10
|
9天前
|
SQL 关系型数据库 MySQL
|
23天前
|
SQL 数据库 开发者
功能发布-自定义SQL查询
本期主要为大家介绍ClkLog九月上线的新功能-自定义SQL查询。
|
18天前
|
SQL 关系型数据库 MySQL
mysql编写sql脚本:要求表没有主键,但是想查询没有相同值的时候才进行插入
mysql编写sql脚本:要求表没有主键,但是想查询没有相同值的时候才进行插入
30 0
|
6月前
|
SQL 缓存 Java
框架分析(9)-Hibernate
框架分析(9)-Hibernate
|
18天前
|
缓存 Java 数据库连接
Hibernate:Java持久层框架的高效应用
通过上述步骤,可以在Java项目中高效应用Hibernate框架,实现对关系数据库的透明持久化管理。Hibernate提供的强大功能和灵活配置,使得开发者能够专注于业务逻辑的实现,而不必过多关注底层数据库操作。
12 1
|
3月前
|
SQL Java 数据库连接
Hibernate 是一款开源 ORM(对象关系映射)框架,封装了 JDBC,允许以面向对象的方式操作数据库,简化了数据访问层的开发。
Hibernate 是一款开源 ORM(对象关系映射)框架,封装了 JDBC,允许以面向对象的方式操作数据库,简化了数据访问层的开发。通过映射机制,它可以自动处理对象与数据库表之间的转换,支持主流数据库,提高了代码的可移植性和可维护性。其核心接口包括 SessionFactory、Session 和 Transaction 等,通过它们可以执行数据库的 CRUD 操作。配置方面,需在项目中引入 Hibernate 及数据库驱动依赖,并创建 `hibernate.cfg.xml` 配置文件来设置数据库连接和 Hibernate 行为参数。
47 1
|
3月前
|
数据库 Java 数据库连接
Struts 2 与 Hibernate 的完美邂逅:如何无缝集成两大框架,轻松玩转高效 CRUD 操作?
【8月更文挑战第31天】本文通过具体示例介绍了如何在 Struts 2 中整合 Hibernate,实现基本的 CRUD 操作。首先创建 Maven 项目并添加相关依赖,接着配置 Hibernate 并定义实体类及其映射文件。然后创建 DAO 接口及实现类处理数据库操作,再通过 Struts 2 的 Action 类处理用户请求。最后配置 `struts.xml` 文件并创建 JSP 页面展示用户列表及编辑表单。此示例展示了如何配置和使用这两个框架,使代码更加模块化和可维护。
85 0
|
4月前
|
SQL Java 数据库连接
Java面试题:简述ORM框架(如Hibernate、MyBatis)的工作原理及其优缺点。
Java面试题:简述ORM框架(如Hibernate、MyBatis)的工作原理及其优缺点。
76 0