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

首先,您的映射是错误的:您想要 Person 和 Address 之间的多对多关联?这就是为什么你在中间有那个 PersonAddress 实体的原因?

  • 在 Person 类中,它应该是:

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

  • 在类地址中,它应该是:

    @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 回答