0

この質問のようにマッピングした ManyToMany があります。

簡単にするためにボイラープレートを削除したことに注意してください

@Entity
class Person {

    @OneToMany(mappedBy = "person")
    @OrderBy("sort")
    private List<PersonAddress> adresses = new ArrayList<>();

}

@Entity
class PersonAdress {
    @EmbeddedId
    private PersonAdressId id;
    @Column
    private int sort;

    @ManyToOne
    private Person person;

    @ManyToOne
    private Address address;
}

@Entity
class Address {
    @OneToMany(mappedBy = "address")
    @OrderBy("sort")
    private List<PersonAddress> persons = new ArrayList<>();
}

@Embeddable
public class PersonAdressId implements Serializable {
    @Column(name = "person_id")
    private long personId;
    @Column(name = "address_id")
    private long addressId;
}

個人の住所をすべて取得し、並べ替え属性で並べ替えようとしています。しかし、何らかの理由で例外が発生するか、ソートされません。

私は次のことを試しました:

"select p from Person p where p.id=pid join fetch p.address a order by a.sort"

私も試しました:

Person person = entityManager.find(Person.class, personId);
person.getAddress() //<-- This should use the @OrderBy, but I don't get it ordered nor does it print out order by in the output

機能しない理由を誰でも見つけることができますか?

4

2 に答える 2

0

まず、マッピングは false です。 Person と Address の間に多対多の関連付けが必要ですか? その PersonAddress エンティティが真ん中にあるのはそのためですか?

  • クラス Person では、次のようにする必要があります。

    @OneToMany(mappedBy = "person") private List<PersonAddress> personAdresses = new ArrayList<>();

  • クラス Address では、次のようにする必要があります。

    @OneToMany(mappedBy = "address") private List<PersonAddress> personAddresses = new ArrayList<>();

それが PersonAddress エンティティのメンバーであるため、その場合にのみソートが機能します

于 2015-09-22T07:14:53.417 に答える
0

次のクエリを試しましたか:

Select p From Person p Left Join p.adresses a Where p.id = :pid Order By a.sort

詳細については、HQLリファレンスを参照してください。

于 2015-09-22T06:59:53.700 に答える