new QueryWrapper<>()和Wrappers.query()的区别
时间: 2024-02-21 08:58:59 浏览: 61
`new QueryWrapper<>()` 和 `Wrappers.query()` 都是 MyBatis-Plus 中用于构建查询条件的工具类。它们的区别如下:
- `new QueryWrapper<>()` 是 QueryWrapper 的构造方法,用于创建一个空的查询条件构造器。
- `Wrappers.query()` 是 Wrappers 的静态方法,用于创建一个空的查询条件构造器。`Wrappers` 是一个工具类,提供了一系列静态方法,用于创建各种类型的查询条件构造器,包括 `QueryWrapper`、`UpdateWrapper` 和 `LambdaQueryWrapper` 等。
它们的使用方法类似,都可以通过链式调用的方式添加查询条件,例如:
```java
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("name", "张三").ge("age", 18);
QueryWrapper<User> queryWrapper2 = Wrappers.query();
queryWrapper2.eq("name", "李四").ge("age", 20);
```
其中,`eq` 方法表示等于,`ge` 方法表示大于等于。这两个查询条件构造器的作用是相同的,只是创建方式不同。
相关问题
private Map<String, String> checkOwnerNames(List<String> ownerNames) { LambdaQueryWrapper<PmBuildingDetailExcelVo> queryWrapper=Wrappers.lambdaQuery(); queryWrapper.select(PmBuildingDetailExcelVo::getOwnerName).in(PmBuildingDetailExcelVo::getOwnerName,ownerNames); List<PmRoomInfoInfo> roomInfoInfoList=this.list(queryWrapper); if(LinkRuleHelper.isNotNull(roomInfoInfoList)){ return roomInfoInfoList.stream().collect(Collectors.toMap(e->e.getRoomId()+"_"+e.getBuildingName(), PmBuildingDetailExcelVo::getOwnerName,(k1,k2)->k2)); } else { return new HashMap<>(); } }我这个写的有问题吗
根据你提供的代码,有几个问题需要注意:
1. `queryWrapper.select(PmBuildingDetailExcelVo::getOwnerName)` 选择的是 `PmBuildingDetailExcelVo` 的属性 `ownerName`,而不是 `PmRoomInfoInfo` 的属性。请确保选择的属性与查询的实体类一致。
2. 在 `collect()` 方法中,`PmBuildingDetailExcelVo::getOwnerName` 应该改为 `PmRoomInfoInfo::getOwnerName`,以保持一致性。
3. 在 `collect()` 方法中,`(k1, k2) -> k2` 的作用是当遇到键冲突时,后面的值将会覆盖前面的值。在这里,由于你使用了 `PmBuildingDetailExcelVo::getOwnerName` 作为值提取函数,而不是 `PmRoomInfoInfo::getOwnerName`,这可能导致值被错误地覆盖。为了避免这个问题,可以将 `(k1, k2) -> k2` 改为 `(k1, k2) -> k1`,或者直接省略这个参数,使用默认的合并函数。
修正后的代码如下所示:
```java
private Map<String, String> checkOwnerNames(List<String> ownerNames) {
LambdaQueryWrapper<PmRoomInfoInfo> queryWrapper = Wrappers.lambdaQuery();
queryWrapper.select(PmRoomInfoInfo::getOwnerName).in(PmRoomInfoInfo::getOwnerName, ownerNames);
List<PmRoomInfoInfo> roomInfoInfoList = this.list(queryWrapper);
if (LinkRuleHelper.isNotNull(roomInfoInfoList)) {
return roomInfoInfoList.stream()
.collect(Collectors.toMap(e -> e.getRoomId() + "_" + e.getBuildingName(),
PmRoomInfoInfo::getOwnerName));
} else {
return new HashMap<>();
}
}
```
请确保在使用代码前导入相关的类,并根据实际情况进行适当的调整。
public enum NaturalResourcesEnum { TDDLTB("td_dltb", TdDltb.class), TDGDDB("td_gddb", TdGddb.class), GDZLDJ("gd_zldj", GdZldj.class) ; private String tablename; private Class aClass; NaturalResourcesEnum(String tablename, Class aClass) { this.tablename = tablename; this.aClass = aClass; }Class<T> tableClass = NaturalResourcesEnum.getTableClass(dto.getTablename()); QueryWrapper<?> wrapper = Wrappers.query(); wrapper.likeRight("adcd",dto.getAdcd()); List<Map> map = this.baseMapper.naturalResourcesPageList(dto.getTablename(), wrapper); List<Map> transferMapList = new ArrayList<>(); //将有下划线的转驼峰 map.forEach(x ->{ Map transferMap = MapUtil.formatHumpName(x); transferMapList.add(transferMap); }); List<Map>怎么将枚举对应的实体类把List<Map>转为List<实体类>
可以使用Java的反射机制,通过枚举中存储的实体类的Class对象来进行实例化,然后再将List<Map>中的数据逐个转化为实体类对象,并添加到List<实体类>中。以下是示例代码:
```
public List<T> convertMapListToEntityList(List<Map> mapList, Class<T> entityClass) throws Exception {
List<T> entityList = new ArrayList<>();
for (Map map : mapList) {
T entity = entityClass.newInstance();
BeanUtils.populate(entity, map);
entityList.add(entity);
}
return entityList;
}
// 调用方式
NaturalResourcesEnum naturalResource = NaturalResourcesEnum.TDDLTB;
List<Map> mapList = baseMapper.naturalResourcesPageList(naturalResource.getTablename(), wrapper);
List<T> entityList = convertMapListToEntityList(mapList, naturalResource.getAClass());
```