Java 给出不同结果集的查询

Java 给出不同结果集的查询,java,orm,mybatis,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> getProp

我面临着一个奇怪的问题,当我在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个元组,而不是psql服务平台上的9个元组-正确的ans,但仍然给了我modCount,映射的计数为9。我发现这和哈希代码有关。在使用xyz和def两个类中的主键id重写哈希代码后,它增加到7个元组。现在我想知道为什么即使我提供了一个主键,并且在地图上使用了一个素数分布,它也会发生。我的想法快用完了

当您使用@MapKey MyBatis时,它首先将行转换为def类型的结果映射值类型的对象列表,然后将@MapKey指定的属性值作为xyz类型的键。这意味着xyz类应该遵循映射键的约定,也就是说,它应该定义hashCode和equals。因此,您首先应该考虑这两种方法的正确定义

即使您定义了正确的hashCode和equals,如果查询返回的某些行与您定义的xyz的equality具有相同的值,您仍然可能会看到行数上的差异

例如,如果xyz是简单字符串,则无法正确映射以下结果:

xyz | def
----+----
 ab |  1
 ab |  2  
如果您想一想,就会发现在这种情况下,没有正确的方法将结果作为映射返回。仅当键在结果集中是唯一的时,才能正确执行此操作