【问题标题】:Spring boot use jpa sql and pageableSpring Boot 使用 jpa sql 和 pageable
【发布时间】:2017-01-10 17:26:18
【问题描述】:

我是java的新生。我想从数据库中选择数据并使用Pageable。我必须在jpa中使用hql。
RestController.java 中的代码:

@RestController
@RequestMapping("/api")
public class ReportController {

    private static final Logger logger = LoggerFactory.getLogger(ReportController.class);
    private static Validator validator;

    @Autowired
    private ReportService reportService;

    @InitBinder
    protected void initBinder(WebDataBinder binder) {
        ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
        validator = factory.getValidator();
    }

@RequestMapping(value = "/reports", method = RequestMethod.POST, produces = MediaTypes.JSON_UTF_8)
    public JSONObject getReports(@RequestBody ReportQueryRequest reportQueryRequest){
        logger.info("[Monitor List] partial / Params: {}", reportQueryRequest);
        Set<ConstraintViolation<ReportQueryRequest>> errors = validator.validate(reportQueryRequest);
        String name = reportQueryRequest.getReportName();
        int status = reportQueryRequest.getReportStatus();
        String createTime = reportQueryRequest.getCreateTime();
        int statusArray[];
        if (status == 3) {
            statusArray = new int[2];
            statusArray[0] = 0;
            statusArray[1] = 1;
        }else {
            statusArray = new int[1];
            statusArray[0] = status;
        }
        if (name == null){
            name = "";
        }
        if (createTime == null || !createTime.contains(",")){
            return ResponseWrapper.buildResponse(RTCodeEnum.C_PARAM_ERROR, "createTime error");
        }
        createTime = createTime.replace(" ", "");
        String[] createTimeArray = createTime.split(",");
        long startTime = Long.valueOf(createTimeArray[0]);
        long endTime = Long.valueOf(createTimeArray[1]);
        List<Report> reportList = reportService.getReportList(startTime, endTime, name, statusArray);
        return ResponseWrapper.buildResponse(RTCodeEnum.C_OK, reportList);
    }
}

Service.java 中的代码:

@Service
public class ReportService extends CrudService<Report, ReportRepository> {
    @Override
    @Autowired
    public void setRepo(ReportRepository repo) {
        this.repo = repo;
    }

    @Override
    public Report copy(Report from, Report to) {
        to = from;
        return to;
    }

    @Autowired
    private ReportRepository reportRepository;

    public List<Report> getReportList(long startTime, long endTime, String name, int[] status) {
        return reportRepository.findByCondition(startTime, endTime, name, status);
    }
}

Repository.java 中的代码:

@Repository
public interface ReportRepository extends CrudRepository<Report,Long>{
    @Query(value = "select r from Report r where r.createTime >= :startTime and r.createTime <= :endTime and r.name like %:name% and r.status in :status order by r.updateTime DESC")
    List<Report> findByCondition(
            @Param("startTime") long startTime,
            @Param("endTime") long endTime,
            @Param("name") String name,
            @Param("status") int[] status
    );
}

我的程序运行成功。现在,我想使用Pageable,但我不知道如何分页从名为findByCondition 的方法返回的数据。

【问题讨论】:

    标签: java sql spring spring-boot spring-data-jpa


    【解决方案1】:

    使用spring-data-jpa,你只需要使用org.springframework.data.domain.Page返回类型和org.springframework.data.domain.Pageable方法参数。

    @Repository
    public interface ReportRepository extends CrudRepository<Report,Long>{
        @Query(value = "select r from Report r where r.createTime >= :startTime and r.createTime <= :endTime and r.name like %:name% and r.status in :status order by r.updateTime DESC")
        Page<Report> findByCondition(
            @Param("startTime") long startTime,
            @Param("endTime") long endTime,
            @Param("name") String name,
            @Param("status") int[] status,
            Pageable pageParameters
        );
    }
    

    spring-data-jpa 识别返回类型并将相应地编组您的数据。 Pageable 的各个成员将帮助您进行限制和偏移。请注意,查询中的ORDER BY 子句可能与Pageable 中的排序选项冲突。

    【讨论】:

      【解决方案2】:

      这个解决方案怎么样:

      解析器:

      @Configuration
      public class MvcConfig extends WebMvcConfigurerAdapter {
      
          @Override
          public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
              PageableHandlerMethodArgumentResolver resolver = new PageableHandlerMethodArgumentResolver();
              argumentResolvers.add(resolver);
          }
      }
      

      控制器

      @RequestMapping(value = "/getAll", method = RequestMethod.GET)
          public List<YourObjects> allBatches(Pageable pageable) {
              return service.getAllBatches(pageable);
      

      服务

       @Override
       public List<YourObjects> findAll(Pageable pageable) {
              return dao.findAll(pageable.getOffset(), pageable.getPageSize());
      

      道:

      @Query(value = "select * from table limit :offset, :pageSize, nativeQuery = true)
      List<YourObjects> findAll(@Param("offset") Integer offset, @Param("pageSize") Integer pageSize);
      

      【讨论】:

        猜你喜欢
        • 2020-01-19
        • 2018-10-24
        • 2019-07-25
        • 2021-03-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-12
        • 2018-03-21
        相关资源
        最近更新 更多