1

PlayFrameworkv1.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すべてとそれに対応するを(1つのクエリと結合のみで)取得しようとしています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

フェッチのために複数の行を作成し、これを同じインスタンスにマップするようにhibernateに指示する必要があります。

于 2013-03-13T20:15:19.463 に答える