it-roy-ru.com

Возврат объекта страницы из запроса JPA

Я хочу создать JPA с нумерацией страниц. Я попытался реализовать это:

@Override
    public Page<PaymentTransactions> findAll(Specification<PaymentTransactions> spec, Pageable pageable) {

        int pageNumber = pageable.getPageNumber();
        int pageSize = pageable.getPageSize();      

        String hql = "select e from " + PaymentTransactions.class.getName() + " e LIMIT :limit OFFSET :offset";
        TypedQuery<PaymentTransactions> query = entityManager.createQuery(hql, PaymentTransactions.class).setParameter("limit", pageSize).setParameter("offset", pageNumber);
        Page<PaymentTransactions> paymentTransactions = (Page<PaymentTransactions>) query.getResultList();
        return paymentTransactions;
    }

Как я могу вернуть объект страницы без использования приведения?

РЕДАКТИРОВАТЬ Я также попробовал это:

Конечная точка:

@Autowired
private PaymentTransactionRepository transactionRepository;

@GetMapping
public Page<PaymentTransactionsDTO> page(@PathVariable int page, @PathVariable int size) {
        return transactionRepository
                .findAll(page, size)
                .map(mapper::toDTO);
    }

Repository:

public interface PaymentTransactionRepository extends CrudRepository<PaymentTransactions, Integer>, JpaSpecificationExecutor<PaymentTransactions> {

    @Query(nativeQuery=true, 
            value="SELECT * FROM payment_transactions \n-- #pageable\n",
            countQuery="SELECT count(*) FROM payment_transactions")
    Page<PaymentTransactions> findAll(Pageable page);
}

РЕДАКТИРОВАТЬ 2 . Я также попробовал это:

@GetMapping("page")
    public Page<PaymentTransactionsDTO> page(@PathVariable int page, @PathVariable int size) {
        PageRequest pageRequest = PageRequest.of(page, size);
        return transactionRepository.findAll(pageRequest).map(mapper::toDTO);
    }

Интерфейс:

public interface PaymentTransactionRepository extends CrudRepository<PaymentTransactions, Integer>, JpaSpecificationExecutor<PaymentTransactions> {

    Page<PaymentTransactions> findAll(Pageable page);
}

Реализация:

@Override
    public Page<PaymentTransactions> findAll(Pageable page) {
        int pageNumber = page.getPageNumber();
        int pageSize = page.getPageSize();

        String hql = "select e from " + PaymentTransactions.class.getName() + " e LIMIT :limit OFFSET :offset";
        TypedQuery<PaymentTransactions> query = entityManager.createQuery(hql, PaymentTransactions.class)
                .setParameter("limit", pageSize).setParameter("offset", pageNumber);
        Page<PaymentTransactions> paymentTransactions = (Page<PaymentTransactions>) query.getResultList();
        return paymentTransactions;
    }
4
Peter Penzov

Чтобы получить функциональность подкачки и сортировки, мы должны расширить интерфейсы PagingAndSortingRepository или JpaRepository

В вашем случае мы можем добиться того же с помощью кода ниже:

Конечная точка:

@Autowired
private PaymentTransactionRepository transactionRepository;

@GetMapping
public Page<PaymentTransactionsDTO> page(@PathVariable int page, @PathVariable int size) {
    PageRequest pageRequest = PageRequest.of(page, size);
    return transactionRepository
            .findAll(pageRequest)
            .map(mapper::toDTO);
}

Repository:

public interface PaymentTransactionRepository extends JpaRepository<PaymentTransactions, Integer> {
    Page<PaymentTransactions> findAll(Pageable page);
}

Пожалуйста, попробуйте с этим, это должно работать.

1
Vivek Kurmi

Если вы используете API Sepcification должным образом, вам не нужно ничего делать. Spring data JPA сделает это за вас. Во всяком случае, в вашем реализованном методе я не могу видеть использование переменной "spec", поэтому я считаю, что она ошибочна. 

Для остальной части вашего кода, просто следуйте «Spring way», определите репозиторий. Напишите ваш запрос с помощью @Query Annotation, установите native = true, если вы хотите выполнять собственные запросы. Spring data JPA также поддерживает разбиение на страницы в нативных запросах, вам просто нужно предоставить countQuery.

С собственным SQL-запросом и разбиением на страницы ваш интерфейс может выглядеть так:

public interface PaymentTransactionsRepository extends JpaRepository<PaymentTransactions, Integer>{


@Query(nativeQuery=true, 
        value="SELECT * FROM payment_transactions \n-- #pageable\n",
        countQuery="SELECT count(*) FROM payment_transactions")
Page<PaymentTransactions> findAll(Pageable page);

}

Для запросов JPA процесс прост, просто напишите запрос с аннотацией @Query.

0
Muhammad Asher Toqeer