springdata jpa specification 动态查询

最近做了一个动态查询的需求,一开始用的是jpa的example,代码如下。

AppMessage appMessage = convert(queryMessageListReqDto, AppMessage.class);
Example<AppMessage> example = Example.of(appMessage);
List<AppMessage> list = appMessageDao.findAll(specification);

使用之后发现一直查不到数据,检查发现实体类继承了一个基础对象,会自动为创建时间赋值,同时不允许对这个字段进行set操作。
改用specification查询。

Specification<AppMessage> specification = new Specification<AppMessage>() {
                @Override
                public Predicate toPredicate(Root<AppMessage> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
                    List<Predicate> predicates = new ArrayList<Predicate>();
                    if (!StringUtils.isEmpty(queryMessageListReqDto.getUserCode())) {
                        predicates.add(criteriaBuilder.equal(root.<String>get("userCode"), queryMessageListReqDto.getUserCode()));
                    }
                    if (!StringUtils.isEmpty(queryMessageListReqDto.getMessageType())) {
                        predicates.add(criteriaBuilder.equal(root.<String>get("messageType"), queryMessageListReqDto.getMessageType()));
                    }
                    return criteriaBuilder.and(predicates.toArray(new Predicate[predicates.size()]));
                }
            };
List<AppMessage> list = appMessageDao.findAll(specification);

需要注意的是:root.get(“userCode”)这里是实体类的字段名。
简单记录一下。

你可能感兴趣的:(java,java,jpa)