当前使用版本(必填,否则不予处理)

3.3.1

该问题是如何引起的?(确定最新版也有问题再提!!!)

暂时还没有更新最新版本,因为公司代码量较多,没有去测试更新新版本,人力物力稍有点局限,一直使用的是这个版本

重现步骤(如果有就写完整)

就是collection去查询一对多的数据,正常来说我传参进去进行查询,应该只能出现一条sql,但是现在会发现(比如说我 select * from a where a='1',这一条sql,我一对多传参为a='1',假设现在这一条sql查询出来有5条数据,那么问题出现了=>就是查出来的这5条数据竟然每一条也进行查询了,就是多出现了5次select * from a where a='1',这就不对了,按道理在日志台上就是应该只有一条sql,但是现在多出来了这5条,这明显不对了,多出来这五条数据是逐一遍历,也找到自身的a列,然后拿着自己的a列进行查询,这样很影响性能,假如sql多的情况下),但是不影响我查出来的那五条数据,那五条数据还是完整的映射了出来,麻烦请解答一下,是版本太老了,还是新版本也会有这样的问题?或者我该怎么配合你们解决这样的bug

报错信息

无,这是隐藏逻辑bug

Comment From: miemieYaho

什么意思?怎么用的?

Comment From: Mr-CSD

用法我粘贴给你 ① 3.

控制台打印日志: 2021-10-29 14:03:27.280 DEBUG 8672 --- [ XNIO-1 task-2] .selectSaleOrderMaterielDemandStatistics : ==> Preparing: SELECT COUNT(1) FROM ( SELECT a.id, a.sale_order_no, a.sale_order_mapping_id, a.finished_materiel_id AS materiel_id, a.finished_materiel_number AS materiel_number, a.finished_materiel_name AS materiel_name, a.finished_materiel_colour_name AS colour_name, a.finished_materiel_colour_id AS colour_id, a.finished_materiel_definition_specification_id AS materiel_definition_specification_id, a.finished_materiel_specification_description AS specification_description, a.finished_materiel_length AS length, a.finished_materiel_demand_num AS input_num, a.dept_id FROM sale_order_info_demand_mapping AS a LEFT JOIN sale_order_info AS b ON a.sale_order_id = b.id AND b.tenant_id = '1' LEFT JOIN sale_order_info_mapping AS c ON a.sale_order_mapping_id = c.id AND c.tenant_id = '1' WHERE a.del_flag = '0' AND (b.STATUS = '4' OR b.STATUS = '2') AND b.del_flag = '0' AND c.del_flag = '0' AND a.tenant_id = '1' GROUP BY a.finished_materiel_id, (CASE WHEN a.finished_materiel_colour_id IS NULL THEN '' ELSE a.finished_materiel_colour_id END), (CASE WHEN a.finished_materiel_definition_specification_id IS NULL THEN '' ELSE a.finished_materiel_definition_specification_id END), (CASE WHEN a.finished_materiel_length IS NULL THEN '' ELSE a.finished_materiel_length END) ORDER BY a.sale_order_no DESC ) TOTAL 2021-10-29 14:03:27.281 DEBUG 8672 --- [ XNIO-1 task-2] .selectSaleOrderMaterielDemandStatistics : ==> Parameters: 2021-10-29 14:03:27.294 DEBUG 8672 --- [ XNIO-1 task-2] .selectSaleOrderMaterielDemandStatistics : ==> Preparing: SELECT a.id, a.sale_order_no, a.sale_order_mapping_id, a.finished_materiel_id AS materiel_id, a.finished_materiel_number AS materiel_number, a.finished_materiel_name AS materiel_name, a.finished_materiel_colour_name AS colour_name, a.finished_materiel_colour_id AS colour_id, a.finished_materiel_definition_specification_id AS materiel_definition_specification_id, a.finished_materiel_specification_description AS specification_description, a.finished_materiel_length AS length, a.finished_materiel_demand_num AS input_num, a.dept_id FROM sale_order_info_demand_mapping AS a LEFT JOIN sale_order_info AS b ON a.sale_order_id = b.id AND b.tenant_id = '1' LEFT JOIN sale_order_info_mapping AS c ON a.sale_order_mapping_id = c.id AND c.tenant_id = '1' WHERE a.del_flag = '0' AND (b.STATUS = '4' OR b.STATUS = '2') AND b.del_flag = '0' AND c.del_flag = '0' AND a.tenant_id = '1' GROUP BY a.finished_materiel_id, (CASE WHEN a.finished_materiel_colour_id IS NULL THEN '' ELSE a.finished_materiel_colour_id END), (CASE WHEN a.finished_materiel_definition_specification_id IS NULL THEN '' ELSE a.finished_materiel_definition_specification_id END), (CASE WHEN a.finished_materiel_length IS NULL THEN '' ELSE a.finished_materiel_length END) ORDER BY a.sale_order_no DESC LIMIT ?,? 2021-10-29 14:03:27.295 DEBUG 8672 --- [ XNIO-1 task-2] .selectSaleOrderMaterielDemandStatistics : ==> Parameters: 0(Long), 10(Long) 2021-10-29 14:03:27.312 DEBUG 8672 --- [ XNIO-1 task-2] S.selectSaleOrderMaterielInputDemandList : ====> Preparing: SELECT a.sale_order_id, a.sale_order_mapping_id, a.sale_order_no, a.materiel_bill_version, a.input_materiel_id AS materiel_id, a.input_materiel_number AS materiel_number, a.input_materiel_name AS materiel_name, a.input_materiel_definition_specification_id AS materiel_definition_specification_id, '' AS colour_id, '' AS length, a.input_materiel_specification_description AS specification_description, a.input_materiel_brands_name AS input_materiel_brands_name, a.input_materiel_input_num AS input_num, a.replace_materiel_number AS replace_materiel_number, a.replace_materiel_name AS replace_materiel_name FROM sale_order_info_demand_mapping AS a WHERE a.del_flag = '0' AND a.sale_order_mapping_id = ? AND a.finished_materiel_id = ? AND a.finished_materiel_colour_id = ? AND a.finished_materiel_definition_specification_id = ? AND a.finished_materiel_length = ? AND a.tenant_id = '1' 2021-10-29 14:03:27.312 DEBUG 8672 --- [ XNIO-1 task-2] S.selectSaleOrderMaterielInputDemandList : ====> Parameters: ab6ac1901cbc1f6ae0828bbeafba1e08(String), 0a0bde6fa9901bbb8b0bda07725ee012(String), (String), 256ee4163af897657e339206413cb869(String), 0(String) 2021-10-29 14:03:27.340 DEBUG 8672 --- [ XNIO-1 task-2] S.selectSaleOrderMaterielInputDemandList : ======> Preparing: SELECT a.sale_order_id, a.sale_order_mapping_id, a.sale_order_no, a.materiel_bill_version, a.input_materiel_id AS materiel_id, a.input_materiel_number AS materiel_number, a.input_materiel_name AS materiel_name, a.input_materiel_definition_specification_id AS materiel_definition_specification_id, '' AS colour_id, '' AS length, a.input_materiel_specification_description AS specification_description, a.input_materiel_brands_name AS input_materiel_brands_name, a.input_materiel_input_num AS input_num, a.replace_materiel_number AS replace_materiel_number, a.replace_materiel_name AS replace_materiel_name FROM sale_order_info_demand_mapping AS a WHERE a.del_flag = '0' AND a.sale_order_mapping_id = ? AND a.finished_materiel_id = ? AND a.finished_materiel_colour_id = ? AND a.finished_materiel_definition_specification_id = ? AND a.finished_materiel_length = ? AND a.tenant_id = '1' 2021-10-29 14:03:27.341 DEBUG 8672 --- [ XNIO-1 task-2] S.selectSaleOrderMaterielInputDemandList : ======> Parameters: ab6ac1901cbc1f6ae0828bbeafba1e08(String), d8532bf7a5962330b7f8171e33b49515(String), (String), c065de8f833db3e23322653d7c63b42f(String), (String) 2021-10-29 14:03:27.354 DEBUG 8672 --- [ XNIO-1 task-2] S.selectSaleOrderMaterielInputDemandList : <====== Total: 0 2021-10-29 14:03:27.360 DEBUG 8672 --- [ XNIO-1 task-2] S.selectSaleOrderMaterielInputDemandList : ======> Preparing: SELECT a.sale_order_id, a.sale_order_mapping_id, a.sale_order_no, a.materiel_bill_version, a.input_materiel_id AS materiel_id, a.input_materiel_number AS materiel_number, a.input_materiel_name AS materiel_name, a.input_materiel_definition_specification_id AS materiel_definition_specification_id, '' AS colour_id, '' AS length, a.input_materiel_specification_description AS specification_description, a.input_materiel_brands_name AS input_materiel_brands_name, a.input_materiel_input_num AS input_num, a.replace_materiel_number AS replace_materiel_number, a.replace_materiel_name AS replace_materiel_name FROM sale_order_info_demand_mapping AS a WHERE a.del_flag = '0' AND a.sale_order_mapping_id = ? AND a.finished_materiel_id = ? AND a.finished_materiel_colour_id = ? AND a.finished_materiel_definition_specification_id = ? AND a.finished_materiel_length = ? AND a.tenant_id = '1' 2021-10-29 14:03:27.360 DEBUG 8672 --- [ XNIO-1 task-2] S.selectSaleOrderMaterielInputDemandList : ======> Parameters: ab6ac1901cbc1f6ae0828bbeafba1e08(String), 6dd0460785023d724cfbd2184180572d(String), (String), e9820943aeb35a0ecf582d6b32736c1b(String), (String) 2021-10-29 14:03:27.373 DEBUG 8672 --- [ XNIO-1 task-2] S.selectSaleOrderMaterielInputDemandList : <====== Total: 0 2021-10-29 14:03:27.373 DEBUG 8672 --- [ XNIO-1 task-2] S.selectSaleOrderMaterielInputDemandList : <==== Total: 2 2021-10-29 14:03:27.374 DEBUG 8672 --- [ XNIO-1 task-2] .selectSaleOrderMaterielDemandStatistics : <== Total: 1

使用MyBatis-log插件的日志:这样好看一些: -- 155 2021-10-29 14:03:27.281 DEBUG 8672 --- [ XNIO-1 task-2] .selectSaleOrderMaterielDemandStatistics : ==> SELECT COUNT(1) FROM ( SELECT a.id, a.sale_order_no, a.sale_order_mapping_id, a.finished_materiel_id AS materiel_id, a.finished_materiel_number AS materiel_number, a.finished_materiel_name AS materiel_name, a.finished_materiel_colour_name AS colour_name, a.finished_materiel_colour_id AS colour_id, a.finished_materiel_definition_specification_id AS materiel_definition_specification_id, a.finished_materiel_specification_description AS specification_description, a.finished_materiel_length AS length, a.finished_materiel_demand_num AS input_num, a.dept_id FROM sale_order_info_demand_mapping AS a LEFT JOIN sale_order_info AS b ON a.sale_order_id = b.id AND b.tenant_id = '1' LEFT JOIN sale_order_info_mapping AS c ON a.sale_order_mapping_id = c.id AND c.tenant_id = '1' WHERE a.del_flag = '0' AND (b.STATUS = '4' OR b.STATUS = '2') AND b.del_flag = '0' AND c.del_flag = '0' AND a.tenant_id = '1' GROUP BY a.finished_materiel_id, (CASE WHEN a.finished_materiel_colour_id IS NULL THEN '' ELSE a.finished_materiel_colour_id END), (CASE WHEN a.finished_materiel_definition_specification_id IS NULL THEN '' ELSE a.finished_materiel_definition_specification_id END), (CASE WHEN a.finished_materiel_length IS NULL THEN '' ELSE a.finished_materiel_length END) ORDER BY a.sale_order_no DESC ) TOTAL;


-- 156 2021-10-29 14:03:27.295 DEBUG 8672 --- [ XNIO-1 task-2] .selectSaleOrderMaterielDemandStatistics : ==> SELECT a.id, a.sale_order_no, a.sale_order_mapping_id, a.finished_materiel_id AS materiel_id, a.finished_materiel_number AS materiel_number, a.finished_materiel_name AS materiel_name, a.finished_materiel_colour_name AS colour_name, a.finished_materiel_colour_id AS colour_id, a.finished_materiel_definition_specification_id AS materiel_definition_specification_id, a.finished_materiel_specification_description AS specification_description, a.finished_materiel_length AS length, a.finished_materiel_demand_num AS input_num, a.dept_id FROM sale_order_info_demand_mapping AS a LEFT JOIN sale_order_info AS b ON a.sale_order_id = b.id AND b.tenant_id = '1' LEFT JOIN sale_order_info_mapping AS c ON a.sale_order_mapping_id = c.id AND c.tenant_id = '1' WHERE a.del_flag = '0' AND (b.STATUS = '4' OR b.STATUS = '2') AND b.del_flag = '0' AND c.del_flag = '0' AND a.tenant_id = '1' GROUP BY a.finished_materiel_id, (CASE WHEN a.finished_materiel_colour_id IS NULL THEN '' ELSE a.finished_materiel_colour_id END), (CASE WHEN a.finished_materiel_definition_specification_id IS NULL THEN '' ELSE a.finished_materiel_definition_specification_id END), (CASE WHEN a.finished_materiel_length IS NULL THEN '' ELSE a.finished_materiel_length END) ORDER BY a.sale_order_no DESC LIMIT 0,10;


-- 157 2021-10-29 14:03:27.312 DEBUG 8672 --- [ XNIO-1 task-2] S.selectSaleOrderMaterielInputDemandList : ====> SELECT a.sale_order_id, a.sale_order_mapping_id, a.sale_order_no, a.materiel_bill_version, a.input_materiel_id AS materiel_id, a.input_materiel_number AS materiel_number, a.input_materiel_name AS materiel_name, a.input_materiel_definition_specification_id AS materiel_definition_specification_id, '' AS colour_id, '' AS length, a.input_materiel_specification_description AS specification_description, a.input_materiel_brands_name AS input_materiel_brands_name, a.input_materiel_input_num AS input_num, a.replace_materiel_number AS replace_materiel_number, a.replace_materiel_name AS replace_materiel_name FROM sale_order_info_demand_mapping AS a WHERE a.del_flag = '0' AND a.sale_order_mapping_id = 'ab6ac1901cbc1f6ae0828bbeafba1e08' AND a.finished_materiel_id = '0a0bde6fa9901bbb8b0bda07725ee012' AND a.finished_materiel_colour_id = '' AND a.finished_materiel_definition_specification_id = '256ee4163af897657e339206413cb869' AND a.finished_materiel_length = '0' AND a.tenant_id = '1';


-- 158 2021-10-29 14:03:27.341 DEBUG 8672 --- [ XNIO-1 task-2] S.selectSaleOrderMaterielInputDemandList : ======> SELECT a.sale_order_id, a.sale_order_mapping_id, a.sale_order_no, a.materiel_bill_version, a.input_materiel_id AS materiel_id, a.input_materiel_number AS materiel_number, a.input_materiel_name AS materiel_name, a.input_materiel_definition_specification_id AS materiel_definition_specification_id, '' AS colour_id, '' AS length, a.input_materiel_specification_description AS specification_description, a.input_materiel_brands_name AS input_materiel_brands_name, a.input_materiel_input_num AS input_num, a.replace_materiel_number AS replace_materiel_number, a.replace_materiel_name AS replace_materiel_name FROM sale_order_info_demand_mapping AS a WHERE a.del_flag = '0' AND a.sale_order_mapping_id = 'ab6ac1901cbc1f6ae0828bbeafba1e08' AND a.finished_materiel_id = 'd8532bf7a5962330b7f8171e33b49515' AND a.finished_materiel_colour_id = '' AND a.finished_materiel_definition_specification_id = 'c065de8f833db3e23322653d7c63b42f' AND a.finished_materiel_length = '' AND a.tenant_id = '1'; -- ==>==== Total: 0


-- 159 2021-10-29 14:03:27.360 DEBUG 8672 --- [ XNIO-1 task-2] S.selectSaleOrderMaterielInputDemandList : ======> SELECT a.sale_order_id, a.sale_order_mapping_id, a.sale_order_no, a.materiel_bill_version, a.input_materiel_id AS materiel_id, a.input_materiel_number AS materiel_number, a.input_materiel_name AS materiel_name, a.input_materiel_definition_specification_id AS materiel_definition_specification_id, '' AS colour_id, '' AS length, a.input_materiel_specification_description AS specification_description, a.input_materiel_brands_name AS input_materiel_brands_name, a.input_materiel_input_num AS input_num, a.replace_materiel_number AS replace_materiel_number, a.replace_materiel_name AS replace_materiel_name FROM sale_order_info_demand_mapping AS a WHERE a.del_flag = '0' AND a.sale_order_mapping_id = 'ab6ac1901cbc1f6ae0828bbeafba1e08' AND a.finished_materiel_id = '6dd0460785023d724cfbd2184180572d' AND a.finished_materiel_colour_id = '' AND a.finished_materiel_definition_specification_id = 'e9820943aeb35a0ecf582d6b32736c1b' AND a.finished_materiel_length = '' AND a.tenant_id = '1'; -- ==>==== Total: 0 -- ==>== Total: 2 -- ==> Total: 1

有没有发现多出来了两条sql: -- 158 2021-10-29 14:03:27.341 DEBUG 8672 --- [ XNIO-1 task-2] S.selectSaleOrderMaterielInputDemandList : ======> SELECT a.sale_order_id, a.sale_order_mapping_id, a.sale_order_no, a.materiel_bill_version, a.input_materiel_id AS materiel_id, a.input_materiel_number AS materiel_number, a.input_materiel_name AS materiel_name, a.input_materiel_definition_specification_id AS materiel_definition_specification_id, '' AS colour_id, '' AS length, a.input_materiel_specification_description AS specification_description, a.input_materiel_brands_name AS input_materiel_brands_name, a.input_materiel_input_num AS input_num, a.replace_materiel_number AS replace_materiel_number, a.replace_materiel_name AS replace_materiel_name FROM sale_order_info_demand_mapping AS a WHERE a.del_flag = '0' AND a.sale_order_mapping_id = 'ab6ac1901cbc1f6ae0828bbeafba1e08' AND a.finished_materiel_id = 'd8532bf7a5962330b7f8171e33b49515' AND a.finished_materiel_colour_id = '' AND a.finished_materiel_definition_specification_id = 'c065de8f833db3e23322653d7c63b42f' AND a.finished_materiel_length = '' AND a.tenant_id = '1'; -- ==>==== Total: 0


-- 159 2021-10-29 14:03:27.360 DEBUG 8672 --- [ XNIO-1 task-2] S.selectSaleOrderMaterielInputDemandList : ======> SELECT a.sale_order_id, a.sale_order_mapping_id, a.sale_order_no, a.materiel_bill_version, a.input_materiel_id AS materiel_id, a.input_materiel_number AS materiel_number, a.input_materiel_name AS materiel_name, a.input_materiel_definition_specification_id AS materiel_definition_specification_id, '' AS colour_id, '' AS length, a.input_materiel_specification_description AS specification_description, a.input_materiel_brands_name AS input_materiel_brands_name, a.input_materiel_input_num AS input_num, a.replace_materiel_number AS replace_materiel_number, a.replace_materiel_name AS replace_materiel_name FROM sale_order_info_demand_mapping AS a WHERE a.del_flag = '0' AND a.sale_order_mapping_id = 'ab6ac1901cbc1f6ae0828bbeafba1e08' AND a.finished_materiel_id = '6dd0460785023d724cfbd2184180572d' AND a.finished_materiel_colour_id = '' AND a.finished_materiel_definition_specification_id = 'e9820943aeb35a0ecf582d6b32736c1b' AND a.finished_materiel_length = '' AND a.tenant_id = '1';

我上面一对多查询出来的有两条数据,然后这两条数据又遍历去查询自己本身了!

Comment From: Mr-CSD

②:

Comment From: Mr-CSD

②:resultMap的标签复制不过去。。 我再复制一下: resultMap id="SaleOrderInfoDemandMappingVOMap" type="com.bozcloud.bozhi.sale.api.vo.SaleOrderInfoDemandMappingVO"> </resultMap

Comment From: Mr-CSD

我把<>标签删去了,因为我一提交数据就不见了

resultMap id="SaleOrderInfoDemandMappingVOMap" type="com.bozcloud.bozhi.sale.api.vo.SaleOrderInfoDemandMappingVO" id property="id" column="id" result property="saleOrderMappingId" column="sale_order_mapping_id" result property="saleOrderNo" column="sale_order_no" result property="materielBillVersion" column="materiel_bill_version" result property="materielId" column="materiel_id" result property="materielNumber" column="materiel_number" result property="materielName" column="materiel_name" result property="colourId" column="colour_id" result property="colourName" column="colour_name" result property="materielDefinitionSpecificationId" column="materiel_definition_specification_id" result property="specificationDescription" column="specification_description" result property="inputMaterielBrandsName" column="input_materiel_brands_name" result property="replaceMaterielName" column="replace_materiel_name" result property="replaceMaterielNumber" column="replace_materiel_number" result property="inputNum" column="input_num" result property="length" column="length" result property="deptId" column="dept_id" collection property="inputMaterielList" column="{saleOrderMappingId=sale_order_mapping_id,materielId=materiel_id,colourId=colour_id ,materielDefinitionSpecificationId=materiel_definition_specification_id,length=length}" select="selectSaleOrderMaterielInputDemandList" resultMap

Comment From: miemieYaho

你这么用那就是这样的

Comment From: miemieYaho

不然你就sql写left join

Comment From: Mr-CSD

sql写left join也处理不了一对多的啊

Comment From: Mr-CSD

我就很好奇为什么查出来的sql还需要去遍历拿自己再去查询啊?虽然不影响我查询来的那个集合,并且拿自己去查询的数据也映射不出来啊?

Comment From: miemieYaho

所有在xml里写的东西都是mybatis逻辑,你有疑问就去问他们吧