LambdaQueryWrapperX实现联表查询,group_concat,count
时间: 2023-10-23 12:33:59 浏览: 177
多表联合查询
LambdaQueryWrapperX 是 Mybatis-Plus 的增强工具类,可以更方便地实现 Lambda 表达式查询。在实现联表查询、group_concat、count 时也提供了比较便捷的方式。
假设有两个表 A 和 B,A 中包含 id 和 name 两列,B 中包含 a_id 和 value 两列,且 A 中的 id 和 B 中的 a_id 是关联的,可以通过以下方式实现联表查询、group_concat、count:
```java
@Service
public class AService extends ServiceImpl<AMapper, A> {
@Autowired
private AMapper aMapper;
public List<A> selectAWithB() {
return aMapper.selectAWithB();
}
}
@Mapper
public interface AMapper extends BaseMapper<A> {
@Select("SELECT a.*, GROUP_CONCAT(DISTINCT b.value SEPARATOR ',') AS values, COUNT(b.id) AS count FROM a LEFT JOIN b ON a.id = b.a_id ${ew.customSqlSegment}")
List<A> selectAWithB(@Param(Constants.WRAPPER) LambdaQueryWrapperX<A> wrapper);
}
@Data
@EqualsAndHashCode(callSuper = false)
public class A implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(type = IdType.AUTO)
private Integer id;
private String name;
private List<String> values;
private Integer count;
}
@Data
@EqualsAndHashCode(callSuper = false)
public class B implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(type = IdType.AUTO)
private Integer id;
private Integer aId;
private String value;
}
public class AQueryDTO extends A {
private List<B> bList;
}
@Service
public class AService extends ServiceImpl<AMapper, A> {
@Autowired
private AMapper aMapper;
public List<A> selectAWithB() {
LambdaQueryWrapperX<A> wrapper = new LambdaQueryWrapperX<>();
wrapper.select(A::getId, A::getName);
wrapper.select(SqlKeyword.CUSTOM, "GROUP_CONCAT(DISTINCT b.value SEPARATOR ',') AS values");
wrapper.select(SqlKeyword.CUSTOM, "COUNT(b.id) AS count");
wrapper.leftJoin(B.class, B::getAId, A::getId, AQueryDTO::getBList);
return aMapper.selectAWithB(wrapper);
}
}
```
使用 LambdaQueryWrapperX 可以通过 Lambda 表达式更方便地构造 SQL 语句。在 select 中可以使用 A::getId、A::getName 等方式指定要查询的字段,也可以使用 SqlKeyword.CUSTOM 和自定义 SQL 语句实现聚合函数的计算。在 leftJoin 中可以使用 B.class、B::getAId、A::getId、AQueryDTO::getBList 等方式指定要关联的表、关联条件和返回的字段。在以上示例中,实现了通过 A 和 B 关联查询,返回 A 表中的全部字段,以及 B 表中的 value 字段去重后的结果和 B 表中的记录数。注意,LambdaQueryWrapperX 中的 select 和 leftJoin 方法需要传入实体类的属性引用,因此需要定义一个继承自 A 的 AQueryDTO 类,在其中定义一个 B 的 List 属性用于接收关联查询的结果。
阅读全文