2014-02-17 20 views
10

Ich benutze Spring-Daten-Jpa und Querydsl (3.2.3)
Ich habe ein Szenario, in dem ich Satz von Prädikaten basierend auf Benutzer filer/Eingabe erstellen. All dies kommt zu BooleanExpression.QueryDsl - Unterabfrage in Sammlungsausdruck

Mein vereinfachtes Modell sieht wie folgt:

@Entity 
public class Invoice { 
    @ManyToOne 
    private Supplier supplier; 
} 

@Entity 
public class Supplier { 
    private String number; 
} 

@Entity 
public class Company { 
    private String number; 
    private boolean active 
} 

Nun, was mit ich bin zu kämpfen ist diese Abfrage:

SELECT * FROM Invoice WHERE invoice.supplier.number in (SELECT number from Company where active=true) 

Also im Grunde ich in CollectionExpression wie Format zu Unterabfrage muß, die holen werden Alle Firmen nummerieren und setzen dies in in() Ausdruck.

Meine Feder-Daten-Repositories implementiert CustomQueryDslJpaRepository, die wiederum JpaRepository und QueryDslPredicateExecutor erweitert.
Ich hoffe, die Antwort ist einfach, aber ich bin ziemlich neu zu Querydsl und fand die Lösungen bisher nicht.

Antwort

24

Dies ist eine Variante der Antwort des jaiwo99 in einer JPAesque Form

BooleanExpression exp = invoice.supplier.number.in(new JPASubQuery() 
    .from(company) 
    .where(company.active.isTrue()) 
    .list(company.nu‌​mber)); 

Fühlen Sie sich frei diese in die ursprüngliche Antwort zu verschmelzen.

+1

Scheint so, als wäre 'JPASubQuery' nicht mehr in QueryDSL verfügbar. 4. Konvertiert diese Antwort in:' BooleanExpression exp = invoice.supplier.number.in (JPAExpressions.selectFrom (Firma) .where (company.active.isTrue()) .select (company.nu mber)); ' –

+0

@OliverHernandez Wie erreicht man dasselbe für die Beziehung Many to Mant? https://stackoverflow.com/questions/44830387/how-to-create-predicate-booleanexpression-for-many-to-many-relations-in-jpa –

1

Try this:

QInvoice invoice = QInvoice.invoice; 
QCompany company = QCompany.company; 

List<Invoice> list = new HibernateQuery(sessionFactory.getCurrentSession()) 
     .from(invoice).where(
     new HibernateSubQuery().from(invoice, company).where(
       invoice.supplier.number.eq(company.number).and(
       company.active.eq(true))).exists()).list(invoice); 
+0

Die Sache ist, ich verwende eine Kombination aus Feder-Daten-Jpa und Querydsl. Ich muss ein Querydls-Prädikat erstellen (das mit anderen Prädikaten kombiniert werden kann, um die Suchergebnisse einzugrenzen). Ich muss alle aktiven Firmennummern abrufen und sie als IN() -Klausel in der ersten Abfrage verwenden. Ich versuchte Th wie das, aber es kein Erfolg: 'BooleanExpression exp = invoice.supplier.number.in (company.active.eq (true))' – wiecia

+0

@wiecia, wenn Sie 'in()' verwenden, vergewissern Sie sich Sie haben eine Sammlung als Parameter, scheinbar 'company.active.eq (true)' zeigt keine Sammlung an – Jaiwo99

+0

@wiecia Ich werde die obige Abfrage aktualisieren, um Ihren Bedarf zu erfüllen – Jaiwo99