追加 QueryDSL 谓词或基于过滤器值构建谓词

问题描述 投票:0回答:1

我是 Querydsl 的新手,我正在寻找一种基于过滤器附加/构建谓词的方法。您可以在示例中看到,如果过滤器中的某个字段没有值,则不应将其放入谓词中。

如果这样的事情不可能,那么最好的方法是什么?

例如过滤器(GetPaintingRequest)包含这些字段(过滤器中还有更多,但不重要):

public class GetPaintingsRequest {
    private String author;
    private Integer style;
    private String paintingName;

    //.....getters and setters
}

所以在服务类中我想像这样过滤绘画

public List<Painting> getFilteredPaintings(GetPaintingsRequest request) {
        
        QPainting painting = QPainting.painting;
        
        //predicate for all paintings that are not deleted and not sold
        Predicate query = painting.deleted.isFalse().and(painting.isSold.isFalse());
        
        if (!request.getAuthor().equals("")) {
            //append to existing predicate name of the author
            query.and.painting.autor.eq(request.getAuthor()); //obviously not working - just as an example what I want
            
        }

        if (!request.getPaintingName().equals("")) {
            //append to existing predicate painting name
            query.and.painting.paintingName.eq(request.getPaintingName()); //obviously not working - just as an example what I want
        }
        
        var paintingList = paintingRepository.findAll(query);

}
java spring-data-jpa filtering querydsl predicate
1个回答
1
投票

我找到了解决办法!

QPainting painting = QPainting.painting;
        
BooleanBuilder booleanBuilder = new BooleanBuilder();
booleanBuilder.and(painting.deleted.isFalse().and(painting.isSold.isFalse()));

if (!request.getAuthor().equals("")) {
    booleanBuilder.and(painting.author.eq(request.getAuthor()));
}
if (!request.getPaintingName().equals("")) {
    booleanBuilder.and(painting.paintingName.eq(request.getPaintingName()));
}

Predicate predicate = booleanBuilder;
var paintingList = paintingRepository.findAll(predicate);
© www.soinside.com 2019 - 2024. All rights reserved.