我正在使用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的错误吗?或者是我的错误?我怎样才能得到正确的结果?
感谢您的帮助!
答案 0 :(得分:4)
我认为您必须将查询转换为:
select distinct tile from MapTile tile left join fetch tile.buildingsInfo building
由于你的提取你创建了多行,你需要告诉hibernate将它映射到同一个实例。