Spring启动使用jpa sql和pageable

时间:2016-09-02 14:39:18

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

我是java的新手。我想从数据库中选择数据并使用Pageable.And必须在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的方法返回数据页。

2 个答案:

答案 0 :(得分: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中的排序选项冲突。

答案 1 :(得分:0)

这个解决方案怎么样:

解析器:

@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());

DAO:

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