Spring Jpa 按时间段查询


项目中有需求要按照名称模糊查找和时间段查找数据,可能只有名称没有时间,也可能只有时间没有名称,也可能这几个参数同时匹配,所以要多条件动态查询。

JpaSpecificationExecutor 接口提供很多条件查询方法:

public interface JpaSpecificationExecutor<T> {
    T findOne(Specification<T> var1);

    List<T> findAll(Specification<T> var1);

    Page<T> findAll(Specification<T> var1, Pageable var2);

    List<T> findAll(Specification<T> var1, Sort var2);

    long count(Specification<T> var1);
}

比如方法:

List<T> findAll(Specification<T> var1);


这是项目中的示例:
 @Override
    public List<AdviceEntity> serach(String serach, String stime, String etime) {
        List<AdviceEntity> resultList = null;
        Specification<AdviceEntity> querySpecifi = new Specification<AdviceEntity>() {
            @Override
            public Predicate toPredicate(Root<AdviceEntity> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder cb) {
                List<Predicate> predicates = new ArrayList<>();
                if (StringUtils.isNotBlank(stime)) {
                    //大于或等于传入时间
                    predicates.add(cb.greaterThanOrEqualTo(root.get("commitTime").as(String.class), stime));
                }
                if (StringUtils.isNotBlank(etime)) {
                    //小于或等于传入时间
                    predicates.add(cb.lessThanOrEqualTo(root.get("commitTime").as(String.class), etime));
                }
                if (StringUtils.isNotBlank(serach)) {
                    //模糊查找
                    predicates.add(cb.like(root.get("name").as(String.class), "%" + serach + "%"));
                }
                // and到一起的话所有条件就是且关系,or就是或关系
                return cb.and(predicates.toArray(new Predicate[predicates.size()]));
            }
        };
        resultList = this.adviceDao.findAll(querySpecifi);
        return resultList;
    }







Spring Data JPA中,`JpaRepository`是一个接口,它继承自`PagingAndSortingRepository`接口,提供了基本的数据访问层功能,包括对实体对象的CRUD操作。`JpaRepository`本身并不直接提供查询时间段的功能,但是我们可以使用`JpaRepository`接口中的方法来构建针对时间段查询。 通常,`JpaRepository`接口会与自定义的查询接口或者使用Spring Data提供的方法命名约定来实现复杂的查询,包括时间段查询。例如,如果你想查询某个时间字段在特定时间段内的记录,可以使用以下几种方式: 1. **方法命名约定**:遵循Spring Data JPA的方法命名约定来创建查询方法。例如: ```java List<MyEntity> findByStartDateGreaterThanEqualAndEndDateLessThanEqual(Date start, Date end); ``` 这个方法名的规则表明,它会查找`startDate`大于或等于指定的`start`参数,且`endDate`小于或等于指定的`end`参数的所有`MyEntity`实体。 2. **使用@Query注解**:直接在接口中使用`@Query`注解来定义JPQL或SQL语句,进行复杂的时间段查询。 ```java @Query("SELECT e FROM MyEntity e WHERE e.startDate >= :startDate AND e.endDate <= :endDate") List<MyEntity> findEntitiesWithinDateRange(@Param("startDate") Date startDate, @Param("endDate") Date endDate); ``` 3. ** Specifications**:使用`Specification`来构建复杂的查询条件,包括时间段。 ```java Specification<MyEntity> hasDateRange(Date start, Date end) { return (root, query, criteriaBuilder) -> criteriaBuilder.between(root.get("startDate"), start, end); } ``` 然后可以在你的`JpaRepository`实现类中使用这个Specification。 使用这些方法,你可以灵活地构建针对时间段查询。记得在实际应用这些方法之前,要确保你的实体类中的日期字段是按照正确的格式声明和映射的,这样查询才能正确执行。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值