首页 > 解决方案 > Spring Data JPA 在 @Query 注释存储库方法上使用 Pageable 和 Predicate 过滤器

问题描述

我有一个自定义 DTO:

@Data
@AllArgsConstructor
public class SaleCreditsSearchDto {
    private UUID ticketUuid;
    private UUID saleUuid;
    private String saleType;
    private Long ticketNumber;
    private LocalDateTime date;
    private Double amount;
    private Double saleTotalAmount;
    private String customerName;
    private String accountName;
}

我的存储库中的一个查询返回给我一个 Page 集合:

public interface SaleRepository
        extends CrudRepository<Sale, UUID> {

    @Query("SELECT new com.company.myproject.web.dto.SaleCreditsSearchDto("
            + "ticket.id, sale.id, sale.type, ticket.number, ticket.date, credit.amount, CONCAT(customer.lastname, ' ', customer.firstname), account.title)"
            + " FROM Sale sale"
            + " JOIN sale.ticket ticket"
            + " JOIN sale.credit credit"
            + " JOIN sale.customer customer"
            + " LEFT JOIN sale.account account"
            + " WHERE ticket.idEntity= :identity"
            + " AND ticket.date>= :datebegin"
            + " AND ticket.date< :dateend"
            + " AND ticket.state = 'FINISHED'"
            + " AND credit.initialAmount > 0"
            + " GROUP BY ticket.id, sale.id, credit.initialAmount, customer.lastname, customer.firstname, account.title")
    Page<SaleCreditsSearchDto> findTotalCredits(@Param("identity") String identity,
                                                @Param("datebegin") LocalDateTime dateBegin,
                                                @Param("dateend") LocalDateTime dateEnd,
                                                Predicate<SaleCreditsSearchDto> predicate,
                                                Pageable pageable);
}

但是@Query 方法不接受比@Param 和Pageable 对象更多的参数,所以我不能传递规范实现,也不能传递谓词。

您会建议我继续返回 Page 但可以过滤 SELECT 子句中检索到的某些字段吗?

实现我自己的存储库方法?在@Query 变量中传递过滤器?你以前练习过类似的东西吗?谢谢 :)

标签: hibernatespring-bootfilterspring-data-jpa

解决方案


推荐阅读