少年不惧岁月长_ 2019-03-24 11:09 采纳率: 0%
浏览 496

java springboot +jpa 动态查询分页问题

service 层

 PageRequest pageRequest = new PageRequest(currentPage-0,pageSize);

        List<AuditInfo> auditInfoList =  auditInfoDAO.searchByCondition(date1,date2,new Specification<AuditInfo>() {
                @Override
                public Predicate toPredicate(Root<AuditInfo> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
                    List<Predicate> list = new ArrayList<>();

                    if(!StringUtils.isEmpty(username)){
                        list.add(cb.equal(root.get("userName").as(String.class),username));
                    }

                    if(!StringUtils.isEmpty(condition)){
                        list.add(cb.equal(root.get("parentType").as(String.class),condition));
                    }
                    query.where(cb.and(list.toArray(new Predicate[list.size()])));
                    return query.getRestriction();
                }
        },pageRequest);

dao:

 @Query(value="select audit from AuditInfo audit where audit.createTime>=?1 and audit.createTime<= ?2 ")
    List<AuditInfo> searchByCondition(Date start,Date end,Specification<AuditInfo> specification,Pageable pageable);

查询得到的一直是全部的结果,筛选条件 无效

  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-08-08 12:29
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    在Spring Boot和JPA中,动态查询分页时可能会遇到一些常见的问题。以下是一些建议来解决这些问题:

    1. 使用Specification代替CriteriaBuilder 使用Specification可以更灵活地构建查询条件。

      @Query(value="SELECT a FROM AuditInfo a WHERE a.createTime >= :start AND a.createTime <= :end")
      List<AuditInfo> searchByCondition(Date start, Date end, Pageable pageable);
      
    2. 设置合适的OrderBy 如果你需要按照特定字段对结果进行排序,那么可以在Specification中添加orderBy方法。

      @Query(value="SELECT a FROM AuditInfo a WHERE a.createTime >= :start AND a.createTime <= :end ORDER BY a.userName DESC")
      List<AuditInfo> searchByCondition(Date start, Date end, Pageable pageable);
      
    3. 考虑使用PageImplPageResult PageImplPageResult可以简化分页操作,提供了一个易于使用的接口,使得你可以轻松地处理分页数据。

    4. 检查数据库索引: 确保你的数据库表中有足够的索引以支持高效的查询。例如,如果用户ID经常作为查询条件出现,确保它有一个索引。

    5. 优化查询性能: 考虑使用预编译SQL、缓存查询结果或者使用事务管理器来避免频繁执行数据库查询。

    6. 测试与调试: 在实际应用中,定期运行单元测试可以帮助你发现并修复潜在的问题。

    下面是一个完整的示例,展示如何使用SpecificationPageable以及OrderSpecifier来实现动态分页查询:

    import org.springframework.data.domain.Page;
    import org.springframework.data.domain.PageRequest;
    import org.springframework.data.domain.Sort;
    
    @Service
    public class AuditService {
    
        private final AuditInfoRepository auditInfoRepository;
    
        public AuditService(AuditInfoRepository auditInfoRepository) {
            this.auditInfoRepository = auditInfoRepository;
        }
    
        // 其他业务逻辑...
    
        @Transactional(readOnly = true)
        public Page<AuditInfo> searchAuditInfos(Date startDate, Date endDate, String username, String condition, Integer pageSize, Integer currentPage) {
            Pageable pageable = PageRequest.of(currentPage - 1, pageSize);
            Sort sort = Sort.by(Sort.Direction.DESC, "createTime");
    
            return auditInfoRepository.searchByCondition(startDate, endDate, username, condition, sort, pageable);
        }
    }
    

    在这个示例中,我们首先创建了一个AuditInfoRepository,然后定义了一个searchAuditInfos方法,这个方法接收了所有的参数,并返回一个Page对象。注意,这里没有包含具体的searchByCondition方法,因为我们需要根据实际情况调整查询条件和分页信息。

    评论

报告相同问题?

悬赏问题

  • ¥30 征集Python提取PDF文字属性的代码
  • ¥15 如何联系真正的开发者而非公司
  • ¥15 有偿求苍穹外卖环境配置
  • ¥15 代码在keil5里变成了这样怎么办啊,文件图像也变了,
  • ¥20 Ue4.26打包win64bit报错,如何解决?(语言-c++)
  • ¥15 clousx6整点报时指令怎么写
  • ¥30 远程帮我安装软件及库文件
  • ¥15 关于#自动化#的问题:如何通过电脑控制多相机同步拍照或摄影(相机或者摄影模组数量大于60),并将所有采集的照片或视频以一定编码规则存放至规定电脑文件夹内
  • ¥15 Arduino的wifi连接,如何关闭低功耗模式?
  • ¥15 Android studio 无法定位adb是什么问题?