从 JPA 查询返回页面对象

Pet*_*zov 5 java spring jpa spring-data-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;
    }
Run Code Online (Sandbox Code Playgroud)

如何在不使用转换的情况下返回页面对象?

编辑我也尝试过这个:

终点:

@Autowired
private PaymentTransactionRepository transactionRepository;

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

存储库:

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);
}
Run Code Online (Sandbox Code Playgroud)

编辑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);
    }
Run Code Online (Sandbox Code Playgroud)

界面:

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

    Page<PaymentTransactions> findAll(Pageable page);
}
Run Code Online (Sandbox Code Playgroud)

执行:

@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;
    }
Run Code Online (Sandbox Code Playgroud)

ssp*_*ssp 7

我已经完成了 2 个 SQL 查询。也许它会有用。

  1. 为列表对象创建SQL并添加页面参数:

    query.setMaxResults(pageable.getPageSize());
    query.setFirstResult(pageable.getPageNumber() * pageable.getPageSize());
    
    Run Code Online (Sandbox Code Playgroud)
  2. 使用包装的 Select count(*) 创建相同的 SQL

    countQuery.getSingleResult();
    
    Run Code Online (Sandbox Code Playgroud)

然后将其设为 paga 对象

Page<ViewContract> page = (Page<ViewContract>) new PageImpl(
              selectQueryResultsList, 
              pageable, 
              countQueryResult);
Run Code Online (Sandbox Code Playgroud)


Viv*_*rmi 2

为了获得分页和排序的功能,我们必须扩展PagingAndSortingRepositoryorJpaRepository接口。

对于您的情况,我们可以通过以下代码实现相同的目的:

终点:

@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);
}
Run Code Online (Sandbox Code Playgroud)

存储库:

public interface PaymentTransactionRepository extends JpaRepository<PaymentTransactions, Integer> {
    Page<PaymentTransactions> findAll(Pageable page);
}
Run Code Online (Sandbox Code Playgroud)

请尝试使用这个,它应该有效。