2012-11-23 8 views
5

Ich baue eine dynamische Abfrage mit einem FilfetDto Wenn der Benutzer ein Feld in der Benutzeroberfläche gefüllt hat, das enthält einige Werte, aber nicht alle. Also muß ich jede Eigenschaft testen, eine Abfrage-Filterung nur auf gefüllte (nicht leer) Feld zu konstruieren:Wie vereinfacht man Syntax mit dynamischen QueryDSL, Vermeidung mehrerer "wenn"

JPAQuery dslQuery = new JPAQuery(em); 

    dslQuery.from(book); 
    dslQuery.join(book.author, author);  

    String title = StringUtils.upperCase(StringUtils.trim(_filter.getTitle())); 
    if (StringUtils.isNotBlank(title)) { 
     dslQuery.where(book.title.upper().like(title)); 
    } 
    String isbn = StringUtils.trim(_filter.getIsbn()); 
    if (StringUtils.isNotBlank(isbn)) { 
     dslQuery.where(book.isbn.like(isbn)); 
    } 
    if (_filter.getAuthorId() != null) { 
     dslQuery.where(author.id.eq(_filter.getAuthorId())); 
    } 

Gibt es eine Möglichkeit zu abstrahieren die „if“ mit einer anderen lesbaren Syntax?

würde Ich mag so etwas wie:

JPAQuery dslQuery = new JPAQuery(em); 

    dslQuery.from(book); 
    dslQuery.join(book.author, author); 

    dslQuery.where(book.title.upperIfNotBlank().like(title)); 
    dslQuery.where(book.isbn.likeIfNotNull(isbn)); 
    dslQuery.where(author.id.eqIfNotNull(_filter.getAuthorId())); 

Es wäre schön, wenn der „IfNotNull“ eingeschaltet werden könnte, oder sogar das Standardverhalten sein ...
so wäre es am Ende wie folgt:

dslQuery.where(book.title.upper().like(title)); 
    dslQuery.where(book.isbn.like(isbn)); 
    dslQuery.where(author.id.eq(_filter.getAuthorId())); 

Antwort

3

gibt es eine Möglichkeit zu abstrahieren der "if" mit einer anderen lesbaren Syntax?

Nein, und wahrscheinlich wird es nicht sein. Das Ziel von Querydsl-Ausdrücken ist es, der Form, die von der zugrunde liegenden Persistenztechnologie verwendet wird, so nahe zu kommen.

Wenn Sie einen solchen Ansatz in Ihrem eigenen Projekt verwenden möchten, können Sie dies in Ihre eigene Unterklasse von AbstractJPAQuery einfügen. Querydsl-Abfragen sollen für solche Fälle angepasst werden.

1

Ich erstelle eine QueryDSLHelper-Klasse, die statische Methoden hat, die die NULL-Prüfung vor dem Hinzufügen des Ausdrucks durchführen. Etwas wie folgt aus:

public static void goe(BooleanBuilder builder, DateTimePath<Date> path, Date value) { 
    if(date!=null) { 
     builder.and(path.goe(value)); 
    } 
} 

public static void like(BooleanBuilder builder, StringPath path, String value) { 
    if(value!=null) { 
     builder.and(path.like(value)); 
    } 
} 

Jetzt kann ich nur statisch diese Methoden importieren und rufen sie auf einer Linie:

 like(builder, book.isbn, isbn); 

Dies ist sehr nützlich und sehr sauber/lesbar, wenn ‚Filter‘ zur Durchführung oder ‚filterByExample "Abfragen.

Verwandte Themen