[英]JOOQ dynamic conditions query
大家好,我嘗試制定一種將條件應用於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);
}
而且addQueryConditions
看起來像:
@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")));
}
}
}
但是該字段始終為空...
我如何解決這個問題。
各種TableLike.field(String)
方法區分大小寫。 您的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)));
}
}
}
}
而且元素過濾器是對象數組。
[{"field":"person.name","condition":"like","value":"Carlos"}]
在字段中,我將表格和字段person.name
放在person.name
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.