Возврат объекта страницы из запроса JPA - PullRequest
0 голосов
/ 13 декабря 2018

Я хочу создать 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);
    }

Репозиторий:

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

Ответы [ 2 ]

0 голосов
/ 22 декабря 2018

Чтобы получить функциональность подкачки и сортировки, мы должны расширить интерфейсы 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);
}

Репозиторий:

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

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

0 голосов
/ 20 декабря 2018

Если вы используете Sepcification API должным образом, вам не нужно ничего делать.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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...