我正面临一个奇怪的问题,当我在psql服务平台中运行查询以及在mybatis中映射相应的地图时,我得到不同的结果集。
@Select("SELECT x.a AS \"xyz.a\", x.b AS \"xyz.b\", y.something AS \"def.something\" FROM x INNER JOIN y ON x.someproperty = y.someotherproperty")
@MapKey("xyz")
Map<xyz, def> getProperties();
现在起初看起来它正在取我5个tupples而不是9个(这是在psql服务平台上 - 正确的ans)但仍然给我modCount和地图的计数为9.我想出这个必须做的hashCode的东西。在使用xyz和def类中的主键id覆盖hashCode之后,它增加到7个tupples。现在我想知道为什么它会发生,即使我提供主键并在地图上使用主要分布。我的想法已经不多了。
答案 0 :(得分:0)
当您使用@MapKey时,MyBatis首先将行转换为结果Map
的值类型的对象列表(在您的类型为def
的情况下),然后获取{指定的属性的值{1}}作为密钥(在您的类型为@MapKey
的情况下)。这意味着xyz
类应遵循xyz
键的合同,它应定义Map
和hashCode
consistent。所以你应该首先考虑的是这两种方法的正确定义。
即使您定义了正确的equals
和hashCode
,如果查询返回的某些行与您对{的相等定义具有相同的值,则stil可能会看到行数的差异{1}}。
例如,如果equals
很简单xyz
,则无法正确映射以下结果:
xyz
如果您想一分钟,您会发现在这种情况下,没有正确的方法可以将结果作为String
返回。只有在结果集中键是唯一的时,才能正确完成此操作。