2012-11-23 8 views
5

Sto costruendo una query dinamica utilizzando un FilfetDto Se l'utente ha riempito alcuni campi nell'interfaccia utente, contiene alcuni valori ma non tutti. Quindi devo testare ogni proprietà per costruire un filtraggio di query solo sul compilato Il campo (non vuota):come semplificare la sintassi con QueryDSL dinamico, evitando più "se"

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())); 
    } 

C'è un modo per astrarre il "se" con un'altra sintassi più leggibile?

vorrei qualcosa di simile:

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())); 

Sarebbe bello se il "IfNotNull" potrebbe essere acceso, o anche essere il comportamento di default ...
così che sarebbe finita in questo modo:

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

risposta

3

esiste un modo per astrarre il "se" con un'altra sintassi più leggibile?

No, e probabilmente non ci sarà. Lo scopo delle espressioni Querydsl è di rimanere il più vicino possibile alla forma utilizzata dalla tecnologia di persistenza sottostante.

Se si desidera utilizzare tale approccio nel proprio progetto, sentitevi liberi di inserirlo nella sottoclasse di AbstractJPAQuery. Le query Querydsl sono pensate per essere personalizzate per questi casi.

1

Creo una classe QueryDSLHelper che ha metodi statici che eseguono il controllo Null prima di aggiungere l'espressione. Qualcosa di simile a questo:

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)); 
    } 
} 

Ora posso solo importare staticamente quei metodi e li chiamano su una sola riga:

 like(builder, book.isbn, isbn); 

Ciò è estremamente utile e molto pulito/leggibile in sede di attuazione 'filtro' o 'filterByExample ' interrogazioni.

Problemi correlati