1

我正在使用 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 的错误吗?还是我的错误?我怎样才能得到正确的结果?

谢谢您的帮助 !

4

1 回答 1

4

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

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

由于您的 fetch 您创建了多行,并且您需要告诉 hibernate 将其映射到同一个实例。

于 2013-03-13T20:15:19.463 回答