在@ManyToMany关系中获取与Hibernate / JPA重复的结果对象并播放框架

时间:2013-03-13 20:07:19

标签: hibernate jpa playframework

我正在使用Play Framework v1.2.5和JPA以及Hibernate。

我有2个型号:

@Entity
public class MapTile extends Model {

    // ...

    @Required
    public Integer tileOrder;

    @Required
    @ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    public List<MapBuildingInfo> buildingsInfo;

    // ...
}

@Entity
public class MapBuildingInfo extends Model {

    // ...

    @Required
    public Integer buildingsCount;

    // ...
}

假设我有以下数据:

MapTile :
    tileOrder: 1
    buildingsInfo: 
        - buildingsCount : 1
        - buildingsCount : 2

MapTile :
    tileOrder: 2
    buildingsInfo: 
        - buildingsCount : 3
        - buildingsCount : 4

我正在尝试检索(只有一个查询和加入)所有MapTiles及其对应的MapBuildingInfos

这是我使用的查询:

List<MapTile> list = MapTile.find("from MapTile tile left join fetch tile.buildingsInfo building").fetch();

以下是我列表中的结果:

list[0].tileOrder => 1
list[0].buildingsInfo[0].buildingsCount => 1
list[0].buildingsInfo[0].buildingsCount => 2

list[1].tileOrder => 1
list[1].buildingsInfo[0].buildingsCount => 1
list[1].buildingsInfo[0].buildingsCount => 2

list[2].tileOrder => 2
list[2].buildingsInfo[0].buildingsCount => 3
list[2].buildingsInfo[0].buildingsCount => 4

list[3].tileOrder => 2
list[3].buildingsInfo[0].buildingsCount => 3
list[3].buildingsInfo[0].buildingsCount => 4

而不仅仅是:

list[0].tileOrder => 1
list[0].buildingsInfo[0].buildingsCount => 1
list[0].buildingsInfo[0].buildingsCount => 2

list[1].tileOrder => 2
list[1].buildingsInfo[0].buildingsCount => 3
list[1].buildingsInfo[0].buildingsCount => 4

似乎Hibernate / JPA将每个结果放在一个新的MapTile对象中,因此它会创建一个复制。但是,他正确地填充buildingsInfo MapTile

我不明白为什么会得到这个结果。你知道我做错了什么吗?你知道这是Hibernate / JPA的错误吗?或者是我的错误?我怎样才能得到正确的结果?

感谢您的帮助!

1 个答案:

答案 0 :(得分:4)

我认为您必须将查询转换为:

select distinct tile from MapTile tile left join fetch tile.buildingsInfo building

由于你的提取你创建了多行,你需要告诉hibernate将它映射到同一个实例。