2012-04-26 150 views
3

我有这样使用MyBatis的注解撷取嵌套对象

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

而我的数据模型中的POJO是

Table Item 
- INT id 
- CHAR attribute 

//存储数据地图作为键 - 值对

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的列表,并填充嵌套对象(数据图)

//已通过@Results,@Result走了..

回答

8

这种情况也出现在MyBatis的解决方法有两种:

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

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

MyBatis User guide包含一个使用嵌套结果的示例,但它用于XML配置。 Java注释有一些限制,但理论上应该可以做到这一点(我从来没有尝试过ID,因为我不喜欢在Java代码中选择我的选择,但下面的文章提供了一些有用的信息:IBatis (MyBatis): Handling Joins: Advanced Result Mapping, Association, Collections, N+1 Select Problem)。

+0

最后的注释示例是嵌套的选择...似乎没有办法使用注释实现嵌套结果? – 2017-11-29 01:58:19