springboot springDataJpa vo查询,查询几天前,案例

本文介绍了一个用于展示订单列表的服务实现细节,包括从数据库查询订单信息、转换数据为VO对象及计算时间差显示。该服务使用Java编程,涉及订单状态映射、时间格式化等关键技术。

service

public List<OrderShowVO> selectShowList() {
        List<Object> list = orderDao.findShowList();
        List<OrderShowVO> result = Lists.newArrayList();
        Map<Object, String> map = Maps.newHashMap();
        map.put(1, "交易交付中");
        map.put(2, "交易已完成");
        for (int i = 0; i < list.size(); i++) {
            OrderShowVO vo = new OrderShowVO();
            Object[] obj = (Object[]) list.get(i);
            vo.setId(obj[0].toString());
            vo.setPrice("¥"+obj[1]);
            vo.setGoodtitle(obj[2].toString());
            vo.setContent(obj[3] == null ? "" : obj[3].toString());
            vo.setVisits(obj[4]+"人浏览");
            vo.setNickname(obj[5].toString());
            vo.setState(map.get(obj[6]));
            vo.setTime(timeCheckFun(((Date) obj[7]).getTime(), new Date().getTime()));
            result.add(vo);
        }
        return result;
    }
 private static String timeCheckFun(long startTime, long endTime) {
        long t = endTime - startTime;
        //获取天数时间差
        int days = (int) (t / (1000 * 60 * 60 * 24));
        //获取小时时间差
        int HH = (int) (t / (1000 * 60 * 60));
        //获取分钟时间差
        int mm = (int) (t / (1000 * 60));
        //获取秒时间差
        int ss = (int) (t / (1000));
        String beApart;
        if (days <= 1) {
            if (ss <= 60) {
                beApart = "刚刚";
            } else if (ss > 60 && ss <= 60 * 60) {
                beApart = mm + "分钟前";
            } else if (ss > 60 * 60 && ss <= 60 * 60 * 24) {
                beApart = HH + "小时前";
            } else {
                beApart = days + "天前";
            }
        } else if (days < 30 && days > 1) {
            beApart = days + "天前";
        } else if (days >= 30 && days < 365) {
            int days1 = days / 30;
            beApart = days1 + "月前";
        } else if (days >= 365) {
            int days2 = days / 365;
            beApart = days2 + "年前";
        } else {
            beApart = "历史很久远";
        }
        return beApart;
    }

DAO

    @Query(value = "SELECT g.id,o.price,o.goodtitle,g.content,(CASE WHEN g.visits IS NOT NULL THEN g.visits ELSE 0 END ) as visits,u.nickname,o.state,o.starttime,o.finishtime FROM trans_order o LEFT JOIN trans_goods g ON o.gooid = g.goodsimid LEFT JOIN trans_user u ON o.buyerid = u.idcode WHERE (o.state=1 OR o.state=2) ORDER BY o.starttime DESC",nativeQuery = true)
    List<Object> findShowList();
<think>好的,我现在需要帮助用户了解如何在Spring Data JPA中使用SqlResultSetMapping来映射自定义SQL查询结果。首先,我得回忆一下相关的知识,并结合提供的引用内容来整理出一个清晰的回答。 用户的问题是关于SqlResultSetMapping的示例和用法,所以我需要先确定这个注解的作用。根据引用[1]和[2],SqlResultSetMapping用于结果集映射,特别是将查询结果映射到非实体对象或VO(值对象)。此外,引用[3]和[4]提到,使用这个注解可以将原生SQL查询的结果映射到自定义的POJO或者DTO,而引用[5]则列出了几种返回自定义DTO的方式,其中SqlResultSetMapping是其中之一。 接下来,我需要整理出使用SqlResultSetMapping的具体步骤。首先,用户需要定义一个自定义的DTO类,比如GroupVO,这个类需要有对应的构造方法和字段。然后,在实体类上使用@SqlResultSetMapping注解来定义映射规则,这里可能需要用到@Entity和@Table注解,但要注意DTO是否应该作为实体。不过根据引用[4],投影可能更简单,但用户明确询问的是SqlResultSetMapping,所以需要强调如何在实体类上配置。 然后,在Repository中编写自定义的查询方法,使用@Query注解并设置nativeQuery为true,同时指定resultSetMapping属性为之定义的映射名称。最后,在Service中调用这个方法,并验证返回的数据是否正确。 需要注意的几点是:确保字段别名与目标类属性一致,使用全参数构造方法,以及在实体类上配置映射可能带来的侵入性。此外,引用[2]提到优先使用JPQL,但用户的情况可能需要原生SQL,因此要提醒字段映射的谨慎处理。 现在需要将这些步骤详细地分点说明,并给出代码示例。同时,在回答最后生成相关问题,如其他映射方式、性能比较、常见错误等,以帮助用户进一步了解。</think>以下是在Spring Data JPA中使用$@SqlResultSetMapping$映射自定义SQL查询结果的完整实现流程: ### 一、核心步骤说明 1. **定义DTO/VO类** 创建需要接收查询结果的Java类(非实体类),需包含全参构造方法: ```java public class GroupVO { private String groupName; private Integer memberCount; public GroupVO(String groupName, Integer memberCount) { this.groupName = groupName; this.memberCount = memberCount; } // getters... } ``` 2. **配置结果集映射** 在任意实体类上通过$@SqlResultSetMapping$声明映射规则[^1][^3]: ```java @Entity @Table(name = "t_group") @SqlResultSetMappings({ @SqlResultSetMapping( name = "GroupVOMapping", classes = @ConstructorResult( targetClass = GroupVO.class, columns = { @ColumnResult(name = "group_name", type = String.class), @ColumnResult(name = "count", type = Integer.class) } ) ) }) public class GroupEntity { /* 实体类字段... */ } ``` 3. **编写原生SQL查询** 在Repository接口中使用$@Query$定义查询并指定映射: ```java public interface GroupRepository extends JpaRepository<GroupEntity, Long> { @Query(nativeQuery = true, value = "SELECT g.name as group_name, COUNT(u.id) as count " + "FROM groups g LEFT JOIN users u ON g.id = u.group_id " + "GROUP BY g.name", resultSetMapping = "GroupVOMapping") List<GroupVO> findGroupStatistics(); } ``` 4. **调用查询方法** Service层直接使用映射后的DTO结果: ```java List<GroupVO> results = groupRepository.findGroupStatistics(); ``` ### 二、关键配置解析 | 配置项 | 作用说明 | |----------------------|--------------------------------------------------------------------------| | $name$ | 映射规则标识符,需与@Query的resultSetMapping对应 | | $targetClass$ | 指定目标DTO类(需全路径类名或已导入类) | | $columns$ | 字段映射配置,name对应SQL查询结果列别名,type定义数据类型 | | 全参构造方法 | DTO必须包含与columns顺序严格匹配的构造函数[^5] | ### 三、注意事项 1. **字段别名一致性** SQL查询中的列别名必须与$@ColumnResult$的name属性完全匹配,否则会抛出$ColumnNotFoundException$ 2. **类型安全** 推荐显式声明$type$参数以避免类型转换错误,特别是处理数字类型时 3. **映射位置限制** $@SqlResultSetMapping$必须定义在JPA实体类上,这是规范要求的强制约束[^1] 4. **替代方案对比** 相较于投影接口或JdbcTemplate方式,该方法更适用于复杂结果集的映射场景[^4][^5] $$性能优化建议:当处理大数据集时,可配合分页查询Pageable使用$$
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值