🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
### 健壮的变量 在我们开发中,经常会遇到前端传过来一个搜索条件,后端根据搜索条件进行判断,不为空时加入查询条件。 例如前端一个用户列表,有一个根据用户名进行查询的搜索框,我们一般会这么写。 ```java public User findUser(String userName){ LambdaQuery<User> query = sqlManager.lambdaQuery(User.class); query.andEq(User::getDeleteFlag,0); if(StringUtil.isNotEmpty(userName)){ query.andEq(User::getUserName,userName); } return query.single(); } ``` 如果有很多个这样的字段查询,这样会显得比较臃肿,beetlsql很好的解决了这个问题。 Query工具中内置了两个过滤值的静态方法,`filterEmpty`、`filterNull`,这两个方法返回了一个`StrongValue`对象。 `filterEmpty`方法主要作用是,当一个字段为空时不把他加入查询条件,当字段不为空时才加入查询条件。 为空的判断标准: - 当字段为String类型,会判断空字符串以及NULL。 - 当字段为Collection类型以及其子类时,会调用isEmpty方法判断,以及NULL。 - 当字段为其他对象时,仅仅会判断NULL。 要实现上面的代码,我们只要下面这样写就行了。 ```java public User findUser(String userName){ LambdaQuery<User> query = sqlManager.lambdaQuery(User.class); return query.andEq(User::getDeleteFlag,0) .andEq(User::getUserName,Query.filterEmpty(userName)) .single(); } ``` 如果userName有值的情况下,例如等于"myName",将会生成下面的语句。 ``` select * from user where delete_flag = 0 and user_name = "myName" limit 0,1 ``` 当userName为空字符串或者NULL的时候,user_name 将不会参与条件查询。 ``` select * from user where delete_flag = 0 limit 0,1 ``` `filterNull`方法的作用也是类似的,但是此方法只会判断对象是否等于NULL