Java JOOQ动态条件查询

Java JOOQ动态条件查询,java,sql,spring,jooq,Java,Sql,Spring,Jooq,大家好,我尝试创建一个方法来应用SelectQuery条件,但我不知道如何按名称获取字段或按名称获取表,代码示例 筛选条件的对象是一个数组,如下所示: [{'field': 'ID', 'condition' : 'in', 'value' : ['f4019bc3-d06b-4673-87e7-75bab23ac85a','c13beeef-2893-4a04-9ebf-ecdc851475bc']}] public List<Branch> find(String order,

大家好,我尝试创建一个方法来应用SelectQuery条件,但我不知道如何按名称获取字段或按名称获取表,代码示例

筛选条件的对象是一个数组,如下所示:

[{'field': 'ID', 'condition' : 'in', 'value' : ['f4019bc3-d06b-4673-87e7-75bab23ac85a','c13beeef-2893-4a04-9ebf-ecdc851475bc']}]
public List<Branch> find(String order, JSONArray filters, Integer limit, Integer pageNumber) {
    SelectQuery<Record6<String,Integer,String,String,String,String>> selectSentence = dsl.select(
            branch.ID.as("id"),
            branch.CODE.as("code"), 
            branch.NAME.as("name"), 
            enterprises.ID.as("enterprise.id"), 
            enterprises.NAME.as("enterprise.name"), 
            enterprises.NIT.as("enterprise.nit"))
            .from(branch)
            .leftOuterJoin(enterprises)
            .on(branch.ENTERPRISE.eq(enterprises.ID)).getQuery();
    if(order != null && order.startsWith("-")) {
            selectSentence.addOrderBy(Tables.BRANCH.field(order.substring(1)).desc());
    }else {
            selectSentence.addOrderBy(Tables.BRANCH.field(order).asc());
    }
    addQueryConditions(filters, selectSentence);
    selectSentence.addLimit(limit);
    selectSentence.addOffset((pageNumber - 1) * limit);
    return selectSentence.fetchInto(Branch.class);
}
@SuppressWarnings("unchecked")
private void addQueryConditions(JSONArray filters, SelectQuery<?> query) {
    for (int i = 0, size = filters.length(); i < size; i++){
        JSONObject filter = filters.getJSONObject(i);
        String filterCondition = filter.optString("condition");
        if(Comparator.EQUALS.toSQL().equals(filterCondition)) {
            Field<Object> field = (Field<Object>) query.field(filter.optString("field"));
            Comparator comparator = Comparator.EQUALS;
            query.addConditions(field.compare(comparator, filter.optString("value")));
        }else if(Comparator.GREATER.toSQL().equals(filterCondition)) {
            Field<Object> field = (Field<Object>) query.field(filter.optString("field"));
            Comparator comparator = Comparator.GREATER;
            query.addConditions(field.compare(comparator, filter.optString("value")));
        }else if(Comparator.GREATER_OR_EQUAL.toSQL().equals(filterCondition)) {
            Field<Object> field = (Field<Object>) query.field(filter.optString("field"));
            Comparator comparator = Comparator.GREATER_OR_EQUAL;
            query.addConditions(field.compare(comparator, filter.optString("value")));
        }else if(Comparator.IN.toSQL().equals(filterCondition)) {
            Field<Object> field = (Field<Object>) query.field(filter.optString("field"));
            Comparator comparator = Comparator.IN;
            query.addConditions(field.compare(comparator, filter.optString("value")));
        }else if(Comparator.LESS.toSQL().equals(filterCondition)) {
            Field<Object> field = (Field<Object>) query.field(filter.optString("field"));
            Comparator comparator = Comparator.LESS;
            query.addConditions(field.compare(comparator, filter.optString("value")));
        }else if(Comparator.LESS_OR_EQUAL.toSQL().equals(filterCondition)) {
            Field<Object> field = (Field<Object>) query.field(filter.optString("field"));
            Comparator comparator = Comparator.LESS_OR_EQUAL;
            query.addConditions(field.compare(comparator, filter.optString("value")));
        }else if(Comparator.LIKE.toSQL().equals(filterCondition)) {
            Field<Object> field = (Field<Object>) query.field(filter.optString("field"));
            Comparator comparator = Comparator.LIKE;
            query.addConditions(field.compare(comparator, filter.optString("value")));
        }
    }
}
查询生成器方法如下所示:

[{'field': 'ID', 'condition' : 'in', 'value' : ['f4019bc3-d06b-4673-87e7-75bab23ac85a','c13beeef-2893-4a04-9ebf-ecdc851475bc']}]
public List<Branch> find(String order, JSONArray filters, Integer limit, Integer pageNumber) {
    SelectQuery<Record6<String,Integer,String,String,String,String>> selectSentence = dsl.select(
            branch.ID.as("id"),
            branch.CODE.as("code"), 
            branch.NAME.as("name"), 
            enterprises.ID.as("enterprise.id"), 
            enterprises.NAME.as("enterprise.name"), 
            enterprises.NIT.as("enterprise.nit"))
            .from(branch)
            .leftOuterJoin(enterprises)
            .on(branch.ENTERPRISE.eq(enterprises.ID)).getQuery();
    if(order != null && order.startsWith("-")) {
            selectSentence.addOrderBy(Tables.BRANCH.field(order.substring(1)).desc());
    }else {
            selectSentence.addOrderBy(Tables.BRANCH.field(order).asc());
    }
    addQueryConditions(filters, selectSentence);
    selectSentence.addLimit(limit);
    selectSentence.addOffset((pageNumber - 1) * limit);
    return selectSentence.fetchInto(Branch.class);
}
@SuppressWarnings("unchecked")
private void addQueryConditions(JSONArray filters, SelectQuery<?> query) {
    for (int i = 0, size = filters.length(); i < size; i++){
        JSONObject filter = filters.getJSONObject(i);
        String filterCondition = filter.optString("condition");
        if(Comparator.EQUALS.toSQL().equals(filterCondition)) {
            Field<Object> field = (Field<Object>) query.field(filter.optString("field"));
            Comparator comparator = Comparator.EQUALS;
            query.addConditions(field.compare(comparator, filter.optString("value")));
        }else if(Comparator.GREATER.toSQL().equals(filterCondition)) {
            Field<Object> field = (Field<Object>) query.field(filter.optString("field"));
            Comparator comparator = Comparator.GREATER;
            query.addConditions(field.compare(comparator, filter.optString("value")));
        }else if(Comparator.GREATER_OR_EQUAL.toSQL().equals(filterCondition)) {
            Field<Object> field = (Field<Object>) query.field(filter.optString("field"));
            Comparator comparator = Comparator.GREATER_OR_EQUAL;
            query.addConditions(field.compare(comparator, filter.optString("value")));
        }else if(Comparator.IN.toSQL().equals(filterCondition)) {
            Field<Object> field = (Field<Object>) query.field(filter.optString("field"));
            Comparator comparator = Comparator.IN;
            query.addConditions(field.compare(comparator, filter.optString("value")));
        }else if(Comparator.LESS.toSQL().equals(filterCondition)) {
            Field<Object> field = (Field<Object>) query.field(filter.optString("field"));
            Comparator comparator = Comparator.LESS;
            query.addConditions(field.compare(comparator, filter.optString("value")));
        }else if(Comparator.LESS_OR_EQUAL.toSQL().equals(filterCondition)) {
            Field<Object> field = (Field<Object>) query.field(filter.optString("field"));
            Comparator comparator = Comparator.LESS_OR_EQUAL;
            query.addConditions(field.compare(comparator, filter.optString("value")));
        }else if(Comparator.LIKE.toSQL().equals(filterCondition)) {
            Field<Object> field = (Field<Object>) query.field(filter.optString("field"));
            Comparator comparator = Comparator.LIKE;
            query.addConditions(field.compare(comparator, filter.optString("value")));
        }
    }
}
但字段总是空的

如何解决这个问题。

各种方法都区分大小写。JSON结构发送此输入

[{'field':'ID',…}]
但您的列被重命名为小写的
id

branch.ID.as(“ID”)
我用这个解决问题

    public static void addQueryConditions(String filter, SelectQuery<?> query) {
    JSONArray filterArray = new JSONArray(filter);
    for (int i = 0, size = filterArray.length(); i < size; i++){
        JSONObject filterObject = filterArray.getJSONObject(i);
        String filterCondition = filterObject.optString("condition");
        Field<Object> field = DSL.field(filterObject.optString("field"));
        if(field != null) {
            String fieldValue = filterObject.optString("value");
            if(Comparator.EQUALS.toSQL().equals(filterCondition)) {
                query.addConditions(field.eq(fieldValue));
            }else if(Comparator.GREATER.toSQL().equals(filterCondition)) {
                query.addConditions(field.gt(fieldValue));
            }else if(Comparator.GREATER_OR_EQUAL.toSQL().equals(filterCondition)) {
                query.addConditions(field.ge(fieldValue));
            }else if(Comparator.IN.toSQL().equals(filterCondition)) {
                List<String> listValues = new ArrayList<>();
                if(!Constants.EMPTY_STRING.equals(fieldValue)) {
                    JSONArray valuesJson = new JSONArray(fieldValue);
                    for(int pos = 0; pos < valuesJson.length(); pos++){
                        listValues.add(valuesJson.optString(pos));
                    }
                }
                query.addConditions(field.in(listValues));
            }else if(Comparator.LESS.toSQL().equals(filterCondition)) {
                query.addConditions(field.lt(fieldValue));
            }else if(Comparator.LESS_OR_EQUAL.toSQL().equals(filterCondition)) {
                query.addConditions(field.le(fieldValue));
            }else if(Comparator.LIKE.toSQL().equals(filterCondition)) {
                query.addConditions(field.like(Constants.PERCENT_SYMBOL.concat(fieldValue).concat(Constants.PERCENT_SYMBOL)));
            }
        }
    }
}

在字段中,我放置了表和字段
person.name

在谓词实现中,您的
将出现另一个错误,因为您没有将JSON数组传递给谓词,而只传递序列化数组值,但这与您的问题没有严格的关系。您好@Lukas Eder,谢谢您的快速回答,在查询中
dsl.select(dsl.count()).from(branch)
如何通过字段名添加条件?对不起,我不确定您在问什么。使用where子句。。。?