JPA组装查询条件

本文介绍了使用JPA进行查询的几种方式,包括方法参数的灵活性、简单的查询操作、等值判断、不等于判断、大于判断、between操作、like模糊查询和in条件查询。详细展示了各种查询条件的示例及结果解析,特别指出null值在不同条件下的处理方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

查询示例

    public Page<Student> queryList(StudentVO studentVO){
        int page = 1;
        int size = 20;
        // 创建Pageable对象,页数从0开始查询
        PageRequest pageRequest = PageRequest.of(page-1, size);
        // 拉姆达表达式
        Specification<Student> userSpecification = (root, query, criteriaBuilder)->buildQueryParam(studentVO, root, criteriaBuilder);
        Page<Student> all = studentDao.findAll(userSpecification, pageRequest);
        return all;
    }

查询的方法:

   private Predicate buildQueryParam(StudentVO studentVO, Root<Student> root, CriteriaBuilder criteriaBuilder){
       List<Predicate> list = new ArrayList<>();
       // 拼条件
       if(studentVO.getAge() != null){
           list.add(criteriaBuilder.equal(root.get("age"), studentVO.getAge()));
       }
       // 转换为Predicate[]
       Predicate[] predicates = list.to
### 如何使用 Spring Data JPA 实现动态查询 #### 使用 `Specification` 接口实现复杂条件组合 为了满足不同业务场景下的灵活查询需求,可以利用 `JpaSpecificationExecutor<T>` 来扩展仓库接口。此接口提供了用于创建自定义查询的能力,特别是当涉及到多个字段以及复杂的逻辑运算时尤为有用。 ```java public interface UserRepository extends JpaRepository<User, Long>, JpaSpecificationExecutor<User> { } ``` 接着,在服务层编写如下代码来组装查询条件: ```java import org.springframework.data.jpa.domain.Specification; // ... private Specification<User> buildUserSpec(UserSearchCriteria criteria) { return (root, query, cb) -> { List<Predicate> predicates = new ArrayList<>(); if (criteria.getName() != null && !"".equals(criteria.getName())) { predicates.add(cb.like(root.get("name"), "%" + criteria.getName() + "%")); } if (criteria.getEmail() != null && !"".equals(criteria.getEmail())) { predicates.add(cb.equal(root.get("email"), criteria.getEmail())); } // 可继续添加更多过滤条件 return cb.and(predicates.toArray(new Predicate[0])); }; } ``` 最后调用存储库方法执行带有规格说明的查询操作[^1]。 #### 利用 `QueryByExample` 进行简单匹配查询 对于较为简单的查询场景,则可以直接采用 `QueryByExample` 方式快速完成。这种方式允许开发者仅需指定要查找的对象属性即可轻松构建查询语句而无需关心底层 SQL 或 JPQL 表达式的细节[^5]。 ```java ExampleMatcher matcher = ExampleMatcher.matching() .withIgnoreCase().withStringMatcher(StringMatcher.CONTAINING); User probe = new User(); probe.setName("John"); Example<User> example = Example.of(probe, matcher); List<User> results = userRepository.findAll(example); ``` 以上两种方案均能有效提升应用程序的数据访问能力,具体选择取决于实际应用场景的需求特点[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值