2016-09-02 13 views
1

私は、データベースからデータを選択してPageableを使用したいと考えています。そして、jpaでhqlを使用する必要があります。 RestController.javaで
コード:Service.javaでスプリングブートjpa sqlとpageableを使用する

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

コード:Repository.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 
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という名前のメソッドからデータを返す方法についてはわかりません。

答えて

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); 
0

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の並べ替えオプションと競合する可能性があることに注意してください。

関連する問題