JPA复杂查询(Specification)之排序&反射获取类属性及属性数据类型&List Stream收集字段信息并换行

文章介绍了如何利用JPA的Specification接口进行复杂查询,特别是排序功能的实现,以及通过反射获取类的属性名称和数据类型的方法。示例代码展示了根据条件筛选并按创建日期降序排列的查询,同时提供了打印对象属性及其类型的辅助函数。
摘要由CSDN通过智能技术生成

JPA复杂查询(Specification)之排序&反射获取类属性及属性数据类型

JPA复杂查询(Specification)之排序

    // JPA复杂查询排序
    private static Specification<Order> getOrderSpecLast3Month(String cifNo) {
        return (root, query, cb) -> {
            Calendar start = Calendar.getInstance();
            start.add(Calendar.MONTH, -3);
            String startDate = DateUtil.formatTime(start.getTime()).substring(0, 10);
            List<Predicate> predicates = new ArrayList<>();
            if (!StringUtils.isEmpty(cifNo)) {
                predicates.add(cb.equal(root.get("cifNo").as(String.class), cifNo));
            }
            predicates.add(cb.greaterThanOrEqualTo(root.get("createDate").as(Date.class), cn.hutool.core.date.DateUtil.parse(startDate, "yyyy-MM-dd")));
            Predicate[] p = new Predicate[predicates.size()];
            query.where(cb.and(predicates.toArray(p)));
            query.orderBy(cb.desc(root.get("createDate")));
            return query.getRestriction();
        };
    }

获取类属性名称及数据类型

    private void printProperty(Object o){
        Class<?> c = o.getClass();
        Field[] fields = c.getDeclaredFields();
        System.err.println(fields.length);
        for (Field field: fields) {
            String name = field.getName();
            Class<?> type = field.getType();
            
            System.err.println("字段类型:" + type.getSimpleName() + ",字段名称:" + name);

        }
    }

List Stream收集字段信息并换行

String dealing = dealings.stream().map( o -> o.getOrderNo()).collect(Collectors.joining("<br/>"));
EmailUtil.sendSimpleMail("批量汇款查询结果,訂單號:<br/> " + dealing, "订单银联尚在处理中, 共" + dealings.size() + "个!");

可以使用JPA的Projection机制进行指定字段查询。具体实现可以参考以下代码示例: ```java public interface UserRepository extends JpaRepository<User, Long>, JpaSpecificationExecutor<User> { List<UserProjection> findAllBy(Specification<User> specification); interface UserProjection { Long getId(); String getUsername(); } } ``` 在这个示例中,我们定义了一个Repository接口,并继承了JpaRepository和JpaSpecificationExecutor接口。其中JpaSpecificationExecutor接口提供了Specification查询规范,可以根据条件查询实体数据。 通过定义一个UserProjection接口,我们可以使用JPA的Projection机制指定实体中的特定字段(例如:id和username)。 在findAllBy方法中,我们使用Specification查询规范,并返回UserProjection型的数据列表。 使用该方法实现指定字段查询的示例代码如下: ```java @Autowired private UserRepository userRepository; public List<UserRepository.UserProjection> findUserByUsername(String username) { return userRepository.findAllBy((root, query, criteriaBuilder) -> { query.select(criteriaBuilder.construct( UserRepository.UserProjection.class, root.get("id"), root.get("username") )); return criteriaBuilder.equal(root.get("username"), username); }); } ``` 在这个示例中,我们根据指定的username查询UserProjection型的数据列表,其中Query.select方法中传递了UserProjection的构造器参数列表,用于指定查询字段。指定完查询字段后,我们使用equal方法创建查询条件,并对UserRepository进行调用,完成查询操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值