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

@Queryund Specificationkann nicht kombiniert werden. Siehe diese SO Frage / Antwort für Details.