实际应用场景中遇到个需要连表并分页的功能
还需要各种字段进行条件查询(还有部分范围条件)
好像框架并没有什么好的方式去做(老老实实手写语句拼装吧)
xml调用java方法
注意: 需要是静态的方法
其实调用java
方法很简单
格式就是这样
${@包路径@方法名()}
进阶一点
需要传参数的可以直接在后面的()
中加上参数
如:
${@包路径@方法名(传参1, 参数2)}
举个例子
实现的 java 方法
/** 静态sql生产方法, 给xml里面调用 */
public static String sql(String columnName, BaseRangeSearch brs){
if (gt.equals(brs.relation)) {
return columnName + gt + brs.value.toString();
} else if (ge.equals(brs.relation)) {
return columnName + ge + brs.value.toString();
} else if (lt.equals(brs.relation)) {
return columnName + lt + brs.value.toString();
} else if (le.equals(brs.relation)) {
return columnName + le + brs.value.toString();
} else {
throw new SmartLifeException("未正确匹配范围条件: " + brs.relation);
}
}
xml 中的写法
我这里的data.searchRange
是个list
<if test="data.searchRange != null">
<foreach collection="data.searchRange" item="item" index="index" open="and" close=""
separator="and">
${@com.sy.erp.common.BaseRangeSearch@sql("create_time", item)}
</foreach>
AND sci.id like #{data.zhaoSi}
</if>
自定义的 BaseRangeSearch 实体
public class BaseRangeSearch {
static final String gt = ">";
static final String ge = ">=";
static final String lt = "<";
static final String le = "<=";
@ApiModelProperty(value = "查询条件的值")
private Object value;
@ApiModelProperty(value = "查询条件的关系('>' '>=' '<' '<=' 4种)")
private String relation;
@Override
public String toString() {
return "关系: " + relation + " 值: " + value.toString();
}
public void pottingRangeSearch(@NotNull String columnName,
@NotNull QueryWrapper<?> queryWrapper) {
if (!checkValid()) return;
if (JudgeUtil.hasAnyNull(columnName, queryWrapper)) return;
if (this.getRelation() != null
&& this.getValue() != null) {
String relation = this.getRelation();
if (gt.equals(this.relation)) {
queryWrapper.gt(columnName, this.getValue());
} else if (ge.equals(this.relation)) {
queryWrapper.ge(columnName, this.getValue());
} else if (lt.equals(this.relation)) {
queryWrapper.lt(columnName, this.getValue());
} else if (le.equals(this.relation)) {
queryWrapper.le(columnName, this.getValue());
} else {
throw new SmartLifeException("未正确匹配范围条件: " + relation);
}
}
}
/** 静态sql生产方法, 给xml里面调用 */
public static String sql(String columnName, BaseRangeSearch brs){
if (gt.equals(brs.relation)) {
return columnName + gt + brs.value.toString();
} else if (ge.equals(brs.relation)) {
return columnName + ge + brs.value.toString();
} else if (lt.equals(brs.relation)) {
return columnName + lt + brs.value.toString();
} else if (le.equals(brs.relation)) {
return columnName + le + brs.value.toString();
} else {
throw new SmartLifeException("未正确匹配范围条件: " + brs.relation);
}
}
public boolean checkValid() {
return JudgeUtil.isALlPresent(value, relation);
}
}