gpt4 book ai didi

java - Mybatis:从 select 返回嵌套映射,无需 N+1 选择(即不使用 @Many 或结果映射子查询)

转载 作者:行者123 更新时间:2023-12-01 12:56:52 27 4
gpt4 key购买 nike

对于一个简单的查询:

select primaryKey, secondaryKey, attributeOne, attributeTwo

还有一个简单的域对象:

public class ExampleDto {
Integer primaryKey;
Integer secondaryKey;
String attributeOne;
String attributeTwo;
}

我想要以下内容:

Map<PrimaryKey, Map<SecondaryKey, ExamplDto>>

我当前的方法是有一个额外的 Dto 对象:

<resultMap id="ExampleCollection" type="ExampleCollectionDto" autoMapping="true">
<id property="primaryKey" column="primaryKey" javaType="integer"/>
<collection property="values" ofType="ExampleDto" autoMapping="true">
<id property="primaryKey" column="primaryKey" javaType="integer"/>
<id property="secondaryKey" column="secondaryKey" javaType="integer"/>
</collection>
</resultMap>

public class ExampleCollectionDto {
Integer primaryKey;
List<ExampleDto> values;

public Map<Integer, KeyedValue> getMap() {
Map<Integer, ExampleDto> results;
for(ExampleDto value : values) {
results.put(value.secondaryKey, value);
}
return results;
}
}

并通过映射它

public interface ExampleMapper {
@MapKey("primaryKey")
Map<Integer, ExampleCollectionDto> getExampleCollectionDtoMap();
}

是否有任何方法(通过注释或 xml 映射)来避免收集 DTO,无论是使用基本的 MyBatis 功能还是通过将自己注入(inject)到结果处理流程中?即

public interface ExampleMapper {
// possibly some annotation here
Map<Integer, Map<Integer, ExampleDto>> getExampleDtoMap();
}

到目前为止,我能够弄清楚如何执行此操作的唯一方法会遇到 N+1 查询问题(并且我已经拥有所需的所有数据)。

最佳答案

这并不完全是您想要的,因为映射器接口(interface)中的方法不会直接返回值,但仍然可能是一个选项。

您可以尝试使用自定义ResultHandler来发布处理结果:

示例Mapper.xml

<resultMap id="ExampleDtoMap" type="ExampleDto" autoMapping="true">
<id property="primaryKey" column="primaryKey" javaType="integer"/>
</resultMap>

<select id="getExampleDtoMap" resultMap="ExampleDtoMap">
select * from example_table
</select>

示例Mapper.java

public interface ExampleMapper {
void getExampleDtoMap(ResultHandler handler);
}

MyService.java

class MyResultHandler implements ResultHandler {
Map<Integer, Map<Integer, ExampleDto>> result = new HashMap<>();
@Override
public void handleResult(ResultContext context) {
ExampleDto dto = (ExampleDto)context.getResultObject();
Map<Integer, ExampleDto> map = result.get(dto.primaryKey);
if (map == null) {
map = new HashMap<>();
}
map.put(dto.secondaryKey, dto);
}
};
MyResultHandler handler = new MyResultHandler();
ExampleMapper exampleMapper = ...;
exampleMapper.getExampleDtoMap(handler);

return handler.result;

关于java - Mybatis:从 select 返回嵌套映射,无需 N+1 选择(即不使用 @Many 或结果映射子查询),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23810284/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com