Spring Data @Query + Spezifikation
Dec 04 2020
Können Sie mir helfen, Spezifikationen und Abfragen zu verbinden? Pageable funktioniert einwandfrei, aber ich habe ein Problem mit Spezifikationen. Wo werden keine Suchparameter hinzugefügt.
public interface RakebackRepository extends JpaRepository<Rakeback, Long>,JpaSpecificationExecutor<Rakeback> {
@Override
@Query(value = "SELECT new domain.model.poker.rakeback.Rakeback(ppr.playerId, SUM(ppr.rakeSum), SUM(ppr.fullRakeBackSum), max(ppra.rakeBackBalance), max(ppra.rakebackRank)) FROM Rakeback as ppr LEFT JOIN ppr.Rakeback as ppra on ppra.status = 'active' LEFT JOIN ppra.rakebackRank as rbb on ppra.rakeBackRankId = rbb.id GROUP BY ppr.playerId ")
Page<Rakeback> findAll(Specification<Rakeback> specification, Pageable pageable);
}
Hier ist SQL aus Protokollen
select pokerplaye0_.player_id as col_0_0_, sum(pokerplaye0_.rake_sum) as col_1_0_, sum(pokerplaye0_.full_rake_back_sum) as col_2_0_, max(pokerplaye1_.rake_back_balance) as col_3_0_, max(pokerplaye1_.rake_back_rank_id) as col_4_0_
from rakeback.players_rakebacks pokerplaye0_
left outer join rakeback.players_rakebacks pokerplaye1_ on pokerplaye0_.player_id=pokerplaye1_.player_id and (pokerplaye1_.status='active')
left outer join rakeback.rakeback_settings pokerrakeb2_ on pokerplaye1_.rake_back_rank_id=pokerrakeb2_.id and (pokerplaye1_.rake_back_rank_id=pokerrakeb2_.id)
group by pokerplaye0_.player_id
order by pokerplaye0_.player_id desc limit ?
Hier ist mein Speec
public class RakebackListSpec {
private final OperatorService operatorService;
private final PlayerService playerService;
public static Specification<Rakeback> byPlayerId(Long id) {
return (root, query, criteriaBuilder) ->
criteriaBuilder.equal(root.get("playerId"), id);
}
public static Specification<Rakeback> byOperator(Integer operatorId) {
return (root, query, criteriaBuilder) ->
criteriaBuilder.equal(root.get("operatorId"), operatorId);
}
public Specification<Rakeback> getSpec(RakebackListRequestDto request) {
Specification<Rakeback> spec = Specification.where(byOperator(operatorService.getOperator().getId()));
if(request.getOpPlayerId() != null){
CorePlayer player = playerService.getPlayerByOpPlayerId(request.getOpPlayerId());
spec = spec.and(byPlayerId(player.getId()));
}
return spec;
}
Antworten
4 JamieBisotti Dec 05 2020 at 07:18
@Query
und Specification
kann nicht kombiniert werden. Siehe diese SO Frage / Antwort für Details.