在MybatisPLus中使用find_in_set的用法
时间: 2023-05-22 11:05:48 浏览: 332
在 MybatisPlus 中使用 find_in_set 函数可以通过以下方式实现:
1. 在 xml 映射文件中编写 SQL 语句,使用 CONCAT 和 GROUP_CONCAT 组合起待匹配字符串。
<select id="findInSet" resultType="java.lang.Integer">
SELECT COUNT(*)
FROM table_name
WHERE FIND_IN_SET(#{matchValue}, CONCAT(column_name, ',', GROUP_CONCAT(match_column_name)))
</select>
2. 在对应的 Mapper 接口中声明对应的方法。
@Mapper
public interface TableMapper extends BaseMapper<TableEntity> {
@Select("SELECT COUNT(*) FROM table_name WHERE FIND_IN_SET(#{matchValue}, CONCAT(column_name, ',', GROUP_CONCAT(match_column_name)))")
Integer findInSet(@Param("matchValue") String matchValue);
}
其中,#{matchValue} 表示待匹配的字符串。需要注意的是,如果字符串中含有逗号,需要进行分隔符的转义处理。
相关问题
mybatisplus 使用 find_in_set
MyBatis-Plus是MyBatis的增强工具,在MyBatis的基础上进行了扩展,提供了更加便捷的CRUD操作。MyBatis-Plus支持在XML中使用原生SQL语句,因此可以直接使用MySQL的函数,如"find_in_set"。
假设我们需要查询某个用户是否拥有某个角色,可以使用"find_in_set"函数。例如:
```xml
<select id="getUserByRole" resultMap="userMap">
SELECT * FROM user
WHERE find_in_set(#{roleId}, role_ids)
</select>
```
在这个例子中,我们使用"find_in_set"函数查询用户表中的"role_ids"字段中是否包含指定的"roleId",如果包含则返回该用户。其中,"#{roleId}"是传入的参数。
使用MyBatis-Plus时,可以使用Wrapper或LambdaQueryWrapper来构造查询条件,如下所示:
```java
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
wrapper.apply("find_in_set({0}, role_ids)", roleId);
List<User> userList = userMapper.selectList(wrapper);
```
在这个例子中,我们使用LambdaQueryWrapper构造查询条件,通过"apply"方法传入原生SQL语句,并将"roleId"作为参数传入。最终执行查询并返回查询结果。
需要注意的是,"find_in_set"函数的性能可能会受到影响,因此需要谨慎使用。如果数据量较大,建议使用其他方式来实现查询。
mybatisplus FIND_IN_SET
FIND_IN_SET是MySQL中的一个函数,用于判断一个值是否存在于一个逗号分隔的字符串列表中。在mybatis-plus中,你可以使用lambda().apply方法来拼接SQL,实现类似的功能。下面是一个示例代码:
List<String> realIds = crmProgrammeService.getIdsByRealEstateNames(name);
if (!CollectionUtils.isEmpty(realIds)){
if (realIds.size() == 1){
queryWrapper.like("real_estate_ids", realIds.get(0));
} else {
for (int i = 0; i < realIds.size(); i++) {
if (i == 0) {
queryWrapper.apply(null != realIds.get(i), "(find_in_set({0},real_estate_ids)", realIds.get(i));
} else {
if (i == realIds.size() - 1) {
queryWrapper.or().apply(null != realIds.get(i), "find_in_set({0},real_estate_ids))", realIds.get(i));
} else {
queryWrapper.or().apply(null != realIds.get(i), "find_in_set({0},real_estate_ids)", realIds.get(i));
}
}
}
}
} else {
queryWrapper.isNull("real_estate_ids");
}
这段代码首先通过crmProgrammeService.getIdsByRealEstateNames(name)方法获取到realIds列表。然后根据列表的长度来确定使用like还是find_in_set函数进行查询条件的拼接。如果realIds只有一个元素,使用like方法拼接查询条件;如果realIds有多个元素,使用循环和apply方法拼接find_in_set函数的查询条件,并使用or方法进行逻辑连接。如果realIds为空,查询条件为real_estate_ids为空。
阅读全文