web-dev-qa-db-ja.com

春のリストからページへの変換

春にリストをページに変換しようとしています。私はそれを使用して変換しました

new PageImpl(users、pageable、users.size());

しかし、今ではソートとページ付け自体に問題があります。サイズとページを渡そうとすると、ページネーションが機能しません。

これが私が使用しているコードです。

私のコントローラー

    public ResponseEntity<User> getUsersByProgramId(
        @RequestParam(name = "programId", required = true) Integer programId Pageable pageable) {

    List<User> users = userService.findAllByProgramId(programId);
    Page<User> pages = new PageImpl<User>(users, pageable, users.size());

    return new ResponseEntity<>(pages, HttpStatus.OK);
}

これが私のユーザーレポです

public interface UserRepo extends JpaRepository<User, Integer>{

public List<User> findAllByProgramId(Integer programId);

これが私のサービスです

    public List<User> findAllByProgramId(Integer programId);
35
user3127109

同じ問題がありました。私はsubListを使用しました:

int start = pageable.getOffset();
int end = (start + pageable.getPageSize()) > users.size() ? users.size() : (start + pageable.getPageSize());
Page<User> pages = new PageImpl<User>(users.subList(start, end), pageable, users.size());
55
shilaimuslm

リファレンスドキュメント に示されているように、Spring Dataリポジトリは、Pageable型のパラメーターを宣言するだけで、クエリメソッドのページ分割をサポートし、要求されたPageに必要なデータのみを読み取るようにします。

Page<User> page = findAllByProgramId(Integer programId, Pageable pageable);

これは、Pageオブジェクトで定義されたページサイズ/設定を持つPageableオブジェクトを返します。リストを取得して、そこからページを作成する必要はありません。

13
dubonzi

Dubonziの answer のアドバイスに従って行う必要があります。

特定のListに対してページネーションを引き続き使用する場合は、 PagedListHolder を使用します。

List<String> list = // ...

// Creation
PagedListHolder page = new PagedListHolder(list);
page.setPageSize(10); // number of items per page
page.setPage(0);      // set to first page

// Retrieval
page.getPageCount(); // number of pages 
page.getPageList();  // a List which represents the current page

ソートが必要な場合は、別の PagedListHolderコンストラクターMutableSortDefinition とともに使用します。

4
Willi Mentzel
Try This:

public Page<Patient> searchPatientPage(SearchPatientDto patient, int page, int size){
        List<Patient> patientsList = new ArrayList<Patient>();
        Set<Patient> list=searchPatient(patient);
        patientsList.addAll(list);
        int start =  new PageRequest(page, size).getOffset();
        int end = (start + new PageRequest(page, size).getPageSize()) > patientsList.size() ? patientsList.size() : (start + new PageRequest(page, size).getPageSize());

        return new PageImpl<Patient>(patientsList.subList(start, end), new PageRequest(page, size), patientsList.size());
    }
1
naveen kumar

Page実装 があります:

Page<Something> page = new PageImpl<>(yourList);
1
Sachin Gaur
//1) For a boot application create a paging repository interface
public interface PersonRepository extends PagingAndSortingRepository<Person, 
String> {
// Common CURD method are automatically implemented
}
//2) create a service Interface
public interface PersonService {
    Page<Person> listAllByPage(Pageable pageable); // Use common CURD findAll() method
    Page<Object> listSpecByPage(Pageable pageable, String x);

}
//3) create a service Impl Class of service interface
@Service
public class PersonServiceImpl implements PersonService {

    final PersonRepository personRepository;

    @Autowired
    PersonServiceImpl(PersonRepository personRepository){
    this.personRepository = personRepository;
    }

    @Override
    public Page<Person> listAllByPage(Pageable pageable) {
          return personRepository.findAll(pageable);
    }
    @Override
    public Page<Object> listSpecByPage(Pageable pageable, String path) {
        List<Object> objectlist = new ArrayList<Object>();
        // Do your process to get output in a list by using node.js run on a *js file defined in 'path' varriable
        Page<Object> pages1 = new PageImpl<Object>(objectlist, pageable, objectlist.size());
        return pages1;
    }

}
//4) write your controller
public class PersonController {

    final PersonService personService;

    @Autowired
    PersonController( PersonService personService ){
        this.personService = personService;
    }

    @GetMapping("/get") // Use of findALL() function
    Page<Person> listed( Pageable pageable){
        Page<Person> persons = personService.listAllByPage(pageable);
        return persons;
    } 
    @GetMapping("/spec") // Use of defined function
    Page<Object> listSpec( Pageable pageable, String path){
        Page<Object> obj = personService.listSpecByPage(pageable, path);
        return obj;
   } 

}
0
RBuser2769569

私の場合、以下のコードが機能しています

    int start = pageble.getOffset();
    int end = (start + pageble.getPageSize()) > vehicleModelsList.size() ? vehicleModelsList.size() : (start + pageble.getPageSize());
0
ram

これが解決策になる可能性があります。ソートとページネーションもこの方法で機能します:

コントローラ:

public ResponseEntity<User> getUsersByProgramId(
   @RequestParam(name = "programId", required = true) Integer programId Pageable pageable) {
       Page<User> usersPage = userService.findAllByProgramId(programId, pageable);
       Page<User> pages = new PageImpl<User>(usersPage.getContent(), pageable, usersPage.getTotalElements());

       return new ResponseEntity<>(pages, HttpStatus.OK);
}

サービス:

Page<User> findAllByProgramId(Integer programId, Pageable pageable);

倉庫:

public interface UserRepo extends JpaRepository<User, Integer>{
       public Page<User> findAllByProgramId(Integer programId, Pageable pageable);
}

この方法では、エンティティの別のページも返すことができます。

0
Ashish

リポジトリをPagingAndSortingRepositoryに拡張しようとしましたか?

public interface UserRepo extends PagingAndSortingRepository<Ticket, Integer> {
    Page<User> findAllByProgramId(Integer programId, Pageable pageable);
}

サービス

Page<User> findAllByProgramId(Integer programId, Pageable pageable);

サービスへのインターフェイスを使用していると仮定します:

0
Borgy Manotoy