[英]How to return a custom object from a Spring Data JPA GROUP BY query
[英]Return page object from JPA query
我想用分页创建 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;
}
要获得分页和排序的功能,我们必须扩展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);
}
请试试这个,它应该可以工作。
我已经完成了 2 个 SQL 查询。 可能会有用。
为列表对象创建 SQL 并添加页面参数:
query.setMaxResults(pageable.getPageSize()); query.setFirstResult(pageable.getPageNumber() * pageable.getPageSize());
使用包装的 Select count(*) 创建相同的 SQL
countQuery.getSingleResult();
然后将其用于 paga 对象
Page<ViewContract> page = (Page<ViewContract>) new PageImpl(
selectQueryResultsList,
pageable,
countQueryResult);
如果您正确使用 Sepcification API,那么您不需要做任何事情。 Spring 数据 JPA 会为您完成。 无论如何,在您实现的方法中,我看不到“spec”变量的使用,所以我相信它是错误的。
对于您的其余代码,只需遵循“Spring 方式”,定义一个存储库。 使用@Query Annotation 编写查询,如果要执行 Native 查询,请设置 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 注释编写查询即可。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.