java - QueryDsl 避免多个 if block

标签 java jpa java-8 querydsl

目前我在我的 Java(带有 JPA)EE 项目中使用 Query DSL。我从 UI 收到一个包含所有过滤器的 json 格式的 filterObject。我的 FilterObject 看起来像这样

public class FilterObject {

    private String name;
    private List<Status> status;
    private String module;
    private List<Source> source;
    ......
}

在我的服务类中,我有这样的东西

 public List<MyModel> findByFilter(FilterObject filterObject) {
        BooleanBuilder builder = new BooleanBuilder();

        QMyModel mymodel= QMyModel.myModel;

        if(filterObject.getName() != null) {
            builder.and(mymodel.name.contains(filterObject.getName()));
        }
        if(! CollectionUtils.isEmpty(filterObject.getStatus())) {
            builder.and(mymodel.status.in(filterObject.getStatus()));
        }
        ...............
        ...............
}

终于我有了这个

JPAQuery<MyModel> query = new JPAQuery<>(getEntityManager());
List<MyModel> myModels =  query.from(QMyModel.mymodel).where(builder).fetch();

编辑:

/**
 * QMyModel is a Querydsl query type for MyModel
 */
@Generated("com.querydsl.codegen.EntitySerializer")
public class QMyModel extends EntityPathBase<MyModel> {

    private static final long serialVersionUID = 1041638507L;

    private static final PathInits INITS = PathInits.DIRECT2;

    public static final QMyModel myModel = new QMyModel("myModel");

    public final StringPath name = createString("name");

    public final EnumPath<Status> status = createEnum("status", Status.class);

    public final StringPath module = createString("module");

     ........
     .......
}

所有这些都有效。但我的 FilterObject 正在不断增长,并且有超过 10 个字段。所以我的服务类方法中有大约 10 个 If block 。有没有更好的方法可以避免这么多 if block 。

最佳答案

您可以使用 lambda,或者(在本例中更好)方法引用:

public List<MyModel> findByFilter(FilterObject filterObject) {
    BooleanBuilder builder = new BooleanBuilder();

    QMyModel mymodel = QMyModel.myModel;

    add(builder, filterObject.getName(), mymodel.name::contains);
    add(builder, filterObject.getStatus(), mymodel.status::in);

    ...
}

private <T> void add(BooleanBuilder builder, T filterElement, Function<T, BooleanExpression> booleanExpressionFunction) {
    if (valid(filterElement)) {
        builder.and(booleanExpressionFunction.apply(filterElement));
    }
}

private boolean valid(Object filterElement) {
    if (filterElement == null) {
        return false;
    }
    if (filterElement instanceof Collection) {
        return !((Collection) filterElement).isEmpty();
    }
    return true;
}

关于java - QueryDsl 避免多个 if block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53204767/

相关文章:

Java 8 Stream Reduce 任意类类型

java - 如何将组合框添加到我的布局中? (java)

java - 读取文件并合并它们 JavaFX

java - 如何删除 Java ArrayList 中具有偶数索引的所有元素

java - 如何使用 SQL 或 JPA 确定记录的层次结构

java - 将kafka与jpa一起使用时的良好做法

java - 限制java8并行流的CPU使用率/Java 8并行流的高CPU使用率

java - 使用 Java 从 NetSuite 导出报告

java - Spring 将entitymanager getResultList结果转换为JSON

java - 创建 URL 时如何避免异常?