QueryDsl – JPA-query auf mehrere Felder der zugehörigen Entität

Ein paar einfache Entitäten:

QueryDsl - JPA-query auf mehrere Felder der zugehörigen Entität

Tech-stack

  • Hibernate 5.2.10
  • QueryDsl (jpa, apt) 4.1.4
  • Spring Boot 1.5.6
  • Spring Data JPA (Also, mit repositories)
  • Repositories erweitern QueryDslPredicateExecutor

Ich möchte eine Abfrage machen mit diesem Effekt:

Wählen Sie verbunden Meetups, wo BEIDE der folgenden Bedingungen erfüllt sind für MeetupCampaigns:

* MeetupCampaign.id = x

* MeetupCampaign.approvalStatus = y

Wichtig ist, BEIDE müssen true sein,

Ich bin in der Lage, Ergebnisse zu bekommen, wo entweder der Kriterien wahr sind, aber nicht in der Lage, um einen filter für beide

Ich bin vorbei ein Prädikat, um die repository.findAll()

Ich bin mir nicht sicher, ob die MeetupRepository oder die MeetupCampaignRepository

Dieses Prädikat funktioniert, beim abholen nur die MeetupCampaigns:

meetupCampaign.approvalStatus.eq(approvalStatus).and(meetupCampaign.campaign.id.eq(campaignId));

Scheitert in der Umweg, wenn ich versuche mir das Meetups:

meetup.meetupCampaigns.any().campaign.id.eq(campaignId).and(meetup.meetupCampaigns.any().approvalStatus.eq(approvalStatus));

In diesem Fall, bekomme ich einen MeetupCampaign die entweder Bedingung wahr ist.

Betrachten Sie dieses dataset:

<!-- Should be selected -->
    <meetup_campaign id="600" meetup_id="500" campaign_id="200" approval_status="ACCEPTED"/>
    <meetup_campaign id="605" meetup_id="504" campaign_id="200" approval_status="ACCEPTED"/>
<!-- Rejected because meetupCampaign status declined -->
    <meetup_campaign id="601" meetup_id="501" campaign_id="200" approval_status="DECLINED"/>
<!-- Rejected because wrong campaign id -->
    <meetup_campaign id="602" meetup_id="500" campaign_id="201" approval_status="ACCEPTED"/>
    <meetup_campaign id="606" meetup_id="501" campaign_id="201" approval_status="ACCEPTED"/>
    <meetup_campaign id="603" meetup_id="502" campaign_id="201" approval_status="ACCEPTED"/>
<!-- Rejected on both counts -->
    <meetup_campaign id="604" meetup_id="503" campaign_id="201" approval_status="DECLINED"/>

Beachten Sie, dass meetups 500 und 504 ausgewählt werden sollte.
501 ist das wichtige hier. Es sollte NICHT gewählt werden, weil die beiden MeetupCampaigns zugeordnet, mit jedem scheitern eines der Kriterien.

Können Sie mir helfen, schreiben diese Abfrage?

Updates

(Vereinfachte) Code für die Entitäten:

@Entity
public class Meetup {

    @Id
    @Column(nullable = false, updatable = false)
    @GeneratedValue(strategy = GenerationType.AUTO)
    protected Long id;

    @Fetch(FetchMode.SELECT)
    @RestResource(exported = false)
    @OneToMany(mappedBy = "meetup", fetch = FetchType.EAGER, orphanRemoval = true)
    private Set<MeetupCampaign> meetupCampaigns = new HashSet<>();

}

@Entity
public class MeetupCampaign {

    @Id
    @Column(nullable = false, updatable = false)
    @GeneratedValue(strategy = GenerationType.AUTO)
    protected Long id;

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(nullable = false, updatable = false)
    private Campaign campaign;

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(nullable = false, updatable = false)
    private Meetup meetup;

    @Enumerated(EnumType.STRING)
    private ApprovalStatus approvalStatus;

}

@Entity
public class Campaign {

    @Id
    @Column(nullable = false, updatable = false)
    @GeneratedValue(strategy = GenerationType.AUTO)
    protected Long id;

}
  • Können Sie bitte die Postleitzahl MeetupCampaign Entität? Zumindest die Vereine mit Meetup und Campaign. Auch Sie möchten, wählen Sie Daten nur für MeetupCampaign oder für Meetup auch mit einem join?
  • Die Abfrage zurückgeben soll nur Meetups. Ich bin mir nicht sicher, ob das Ihre Frage beantwortet… Auch, code Hinzugefügt.
InformationsquelleAutor Eric Turley | 2018-02-01



One Reply
  1. 1

    Antwort gefunden hier: QueryDsl – Unterabfrage in der Sammlung Ausdruck

    Können Sie eine Unterabfrage verwenden, Ausdruck zu finden, alle meetupCampaigns mit diesen zwei Eigenschaften und verwenden Sie dann die SimpleExpression.in() zu finden meetups im Zusammenhang mit diesen meetupCampaigns.

    ex.

    meetup.in(JPAExpressions.select(meetupCampaign.meetup).from(meetupCampaign).where(meetupCampaign.campaign.id.eq(campaignId).and(meetupCampaign.approvalStatus.eq(status))).fetchAll());
    • Test bestanden. w00t

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.