动态SQL条件

说明

hsweb定义了一种支持动态条件的数据结构:
1
{ //where name like 张%
2
terms:[
3
{
4
column:"name", //属性名或者列名
5
value:"张", //值,为null或者为""时,此条件将被忽略
6
type:"and", // 连接类型,and 或者 or
7
termType:"like", // like
8
options:["startWith"], //可选项,不同的termType支持不同.
9
terms:[
10
//嵌套,结构同上
11
12
]
13
}
14
]
15
}
Copied!
对应的Java类有: QueryParamEntityUpdateParamEntityDeleteParamEntity

DSL

hsweb提供了通过DSL的方式来构造上述结构,用例:
如果继承了GenericEntityService的类可以直接使用DSL进行查询,修改,删除操作
1
//select * from table where name = ? limit 0,20
2
createQuery().where("name",name).list()
3
// select * from table where name like ?||'%';
4
// 构造并调用其他的dao
5
DefaultDSLQueryService.createQuery(userDao)
6
.where("name$like$startWith",name)
7
.listNoPaging();
Copied!
上述例子中 name$like$startWith的含义: name(列), like(条件),startWith(条件选项)

默认支持的SQL条件

termType
SQL
DSL
说明
is 或者 eq
=
.is()
等于
not
!=
.not()
不等于
gt
>
.gt()
大于
lt
<
.lt()
小于
gte
>=
.gte()
大于等于
lte
<=
.lte()
小于等于
like
like
.like()
模糊匹配.支持options
  1. 1.
    reverse 反转,如: ? like name
  2. 2.
    startWith: like ?||%
  3. 3.
    endWith: like %||?
nlike
not like
.notLike()
同like
in
in
.in()
值可以为以下格式:
  1. 1.
    1,2,3,4 字符串以半角逗号分割.
  2. 2.
    [1,2,3,4] 集合.
nin
not in
.notIn()
同in
isnull
is null
.isNull()
为null
notnull
not null
.notNull()
不为null
empty
= ''
.isEmpty()
为空字符
nempty
!=''
.notEmpty()
不为字符
bwt
between
.between()
在之间
nbwt
not between
.notBetween
不在之间

自定义SQL条件

上述默认支持的SQL条件其实就是用来定义列与条件的拼接方式。在某些场景,我们可能需要定义一些通用的查询条件。
例如: 根据部门ID 查询所有此部门下所有人员的数据,而且有很多功能都要使用此条件。
按照以前的方式,需要在各个需要使用此查询条件的功能里 添加Dao方法或者修改查询配置
hsweb提供了SQL条件的拓展功能,用于添加特殊的查询条件。让自定义的条件用起来就像 like ,> , <一样方便。

创建拓展类

1
//AbstractSqlTermCustomer提供了一些便利的方法
2
@org.springframework.stereotype.Component //注入到spring自动开启支持此条件
3
public class UserInDepartmentTerm extends AbstractSqlTermCustomizer{
4
5
@Override
6
public String getTermType() {
7
//对应Term参数中的属性termType
8
return "user-in-dept";
9
}
10
11
@Override
12
public Dialect[] forDialect() {
13
//对特定对数据库类型生效,返回null时对全部支持对数据库类型生效
14
return null;
15
}
16
17
@Override
18
public SqlAppender accept(String wherePrefix, Term term, RDBColumnMetaData column, String tableAlias) {
19
//当传入了my-term条件对时候,会调用此方法进行拼接
20
//对传入对参数进行转换,此步骤为必须的
21
ChangedTermValue termValue =createChangedValue(term);
22
23
//转换参数,将参数转为集合,以支持in查询.
24
List<Object> idList = BoostTermTypeMapper.convertList(column, termValue.getOld());
25
26
SqlAppender appender= new SqlAppender();
27
28
appender.add(createColumnName(column,tableAlias),"in (select user_id from user_department where t_id");
29
30
//根据参数的数量,构造对应的=或者in条件
31
Object newValue= appendCondition(idList,wherePrefix,appender);
32
33
appender.add(")");
34
//设置新的值到条件中
35
termValue.setValue(newValue);
36
37
return appender;
38
}
39
}
Copied!
使用:
1
// where user_id in(select user_id from user_department where t_id = ? )
2
createQuery().where("userId$user-in-dept","test")
Copied!
这样,无需修改其他任何配置,即可支持查询任何表里指定部门下用户的数据了。
组织架构功能中,提供了一些已经拓展好的SQL条件。
Last modified 2yr ago