2012-11-23 14 views
5

Bir FilfetDto kullanarak dinamik bir sorgu oluşturuyorum Kullanıcı kullanıcı arabiriminde bir alan doldurduysa, bazı değerler içeriyor ama hepsi değil.dinamik QueryDSL ile sözdizimini sadeleştirmek, birden çok "if" den kaçınmaktan kaçınır

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

soyut bir yolu "eğer" ile başka daha okunabilir sözdizimi var mı: Yani ben sadece dolu (boş değil) sahada sorgu filtreleme oluşturmak için her özelliğini test etmek zorunda? Bu "IfNotNull" açık olması olabilir güzel, hatta
yüzden böyle sona ereceğini ... varsayılan davranış olurdu

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

:

Ben böyle bir şey istiyorum:

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

cevap

3

soyut bir yolu "eğer" ile başka daha okunabilir sözdizimi var mı?

Hayır ve muhtemelen orada olmayacak. Querydsl ifadelerin amacı yatan kalıcılık teknolojisi kullandığı forma yakın kalmaktır.

Kendi projede böyle bir yaklaşımı kullanmak istiyorsanız

AbstractJPAQuery kendi alt sınıf içine bu koymak için çekinmeyin. Querydsl sorgular böyle durumlar için özelleştirilmiş olması içindir.

1

Ben ifadeyi eklemeden önce boş denetimi yapmak statik yöntemleri vardır bir QueryDSLHelper sınıf oluşturmak. Böyle bir şey:

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

Şimdi sadece statik olarak bu yöntemleri ithalat ve tek bir satırda bunları arayabilirsiniz:

 like(builder, book.isbn, isbn); 

'filterByExample 'filtreyi' ya uygularken Bu okunabilir/çok temiz, son derece kullanışlı ve bir ' sorguları.

İlgili konular