查询给出不同的结果集

时间:2014-03-20 11:13:08

标签: java orm mybatis

我正面临一个奇怪的问题,当我在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。现在我想知道为什么它会发生,即使我提供主键并在地图上使用主要分布。我的想法已经不多了。

1 个答案:

答案 0 :(得分:0)

当您使用@MapKey时,MyBatis首先将行转换为结果Map的值类型的对象列表(在您的类型为def的情况下),然后获取{指定的属性的值{1}}作为密钥(在您的类型为@MapKey的情况下)。这意味着xyz类应遵循xyz键的合同,它应定义MaphashCode consistent。所以你应该首先考虑的是这两种方法的正确定义。

即使您定义了正确的equalshashCode,如果查询返回的某些行与您对{的相等定义具有相同的值,则stil可能会看到行数的差异{1}}。

例如,如果equals很简单xyz,则无法正确映射以下结果:

xyz

如果您想一分钟,您会发现在这种情况下,没有正确的方法可以将结果作为String返回。只有在结果集中键是唯一的时,才能正确完成此操作。