3

我有一个这样的 POJO

class foo
{
private String id;
private String attribute;
private Map<String, String> dataMap;
}

我的数据模型是

Table Item
- INT id
- CHAR attribute

//将dataMap存储为键值对

Table Data
- INT id
- CHAR key
- CHAR value

现在,我想结合以下 2 个查询

第一个查询:

@Select("select * from Item where attribute=#{attribute}"
public List<Item> getItemList(@Param("attribute") String attribute);

另一个查询来获取给定 id 的所有键值对

如何进行单个查询,给定属性,获取 id 列表并填充嵌套对象(dataMap)

//已经通过@Results,@Result ..

4

1 回答 1

9

这种情况在 myBatis 中可以通过两种方式解决:

  • 嵌套选择 - 您检索项目列表,并为每个项目运行单独的选择以获取数据;
  • 嵌套结果——您通过运行单个连接查询来检索具有关联数据的项目,并让 myBatis 处理结果中的重复子集;

第一个选项对性能非常不利,并导致所谓的“n+1 选择问题”。第二种是做这类事情的首选方式。

MyBatis 用户指南包含一个使用嵌套结果的示例,但它是用于 XML 配置的。Java 注释有一些限制,但理论上应该可以做到(我从未尝试过 id,因为我不喜欢在 Java 代码中进行选择,但以下文章提供了一些有用的信息:IBatis (MyBatis):处理连接:高级结果映射、关联、集合、N+1 选择问题)。

于 2012-07-15T16:08:00.280 回答