java的mapper接收Mysql的select group_concat
时间: 2023-05-14 10:04:11 浏览: 258
函数返回的结果时,如何将结果映射到Java对象中?
可以使用@Results注解和@Result注解来映射结果到Java对象中。例如:
@Results({
@Result(property = "id", column = "id"),
@Result(property = "name", column = "name"),
@Result(property = "age", column = "age"),
@Result(property = "hobbies", column = "hobbies", javaType = List.class, typeHandler = StringListTypeHandler.class)
})
@Select("SELECT id, name, age, GROUP_CONCAT(hobby) as hobbies FROM user GROUP BY id")
List<User> getUsers();
其中,@Results注解用于定义映射规则,@Result注解用于定义每个属性的映射规则。在这个例子中,我们使用了StringListTypeHandler来将字符串转换成List类型。
相关问题
LambdaQueryWrapperX实现联表查询,group_concat,count
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 属性用于接收关联查询的结果。
### The error may exist in file [E:\Java_Pro\Project\basic-code\Springboot_Pro\target\classes\mapper\WaterDetailsMapper.xml] ### The error may involve com.lxyk.mapper.WaterDetailsMapper.queryWaterDetails-Inline ### The error occurred while setting parameters ### SQL: SELECT count(0) FROM (SELECT w.worker_name, w.worker_image, IFNULL(GROUP_CONCAT(DISTINCT c.cust_name), "-") AS cust_details, c.cust_address, IFNULL(GROUP_CONCAT(h.send_water_count), 0) AS send_water_count FROM tb_worker w LEFT JOIN tb_history h ON w.wid = h.worker_id LEFT JOIN tb_customer c ON h.cust_id = c.cid GROUP BY w.worker_name) table_count ### Cause: java.sql.SQLSyntaxErrorException: Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'water.w.worker_image' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
这个错误是由于在 SQL 查询中使用了 GROUP BY 子句,但是 SELECT 列表中包含了未在 GROUP BY 子句中出现且不是聚合函数的列。这是 MySQL 的一种严格模式,即 sql_mode=only_full_group_by,要求 SELECT 列表中的非聚合列必须出现在 GROUP BY 子句中。你需要修改 SQL 查询,将 SELECT 列表中的非聚合列添加到 GROUP BY 子句中,或者使用聚合函数对这些列进行计算。