JPA 2:通过不在带有额外字段的多对多中工作来订购
Posted
技术标签:
【中文标题】JPA 2:通过不在带有额外字段的多对多中工作来订购【英文标题】:JPA 2: Order by not working in ManyToMany with extra fields 【发布时间】:2015-09-22 06:40:09 【问题描述】:我有一个像 question 这样映射的 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
谁能发现它为什么不工作?
【问题讨论】:
你真的看过被调用的 SQL 吗?对于这 2 个 1-N 关系。此外,正如 1 个答案所说,您的映射是错误的。 【参考方案1】:您是否尝试过以下查询:
Select p From Person p Left Join p.adresses a Where p.id = :pid Order By a.sort
有关详细信息,请参阅 HQL reference。
【讨论】:
我试过了,还是不行。我的地址没有正确排序。虽然它很奇怪,因为选择看起来正确。【参考方案2】:首先,您的映射是错误的:您想要 Person 和 Address 之间的多对多关联?这就是为什么中间有那个 PersonAddress 实体的原因?
在 Person 类中,应该是:
@OneToMany(mappedBy = "person")
private List<PersonAddress> personAdresses = new ArrayList<>();
在类地址中,应该是:
@OneToMany(mappedBy = "address")
private List<PersonAddress> personAddresses = new ArrayList<>();
只有这样,您的排序才会起作用,因为它是 PersonAddress 实体的成员
【讨论】:
我的映射不假。你看我贴的链接了吗? ***.com/questions/23837561/… PS:我的人和地址不是我的真实实体,只是我用来说明我的问题的东西 来吧,它是多对多的……而且您的 PersonAddress 与您的映射中的任何内容都没有关联! ...我仍然认为您的映射是错误的! 工作 sql :select p from Person p where p.id=pid join fetch p.personAddresses pa join fetch pa.address a order by pa.sort
确实是错的。如果他有一个 M-N 并且想要一个额外的列,那么他应该有 2 个 1-N 引用 PersonAddress。此外,一旦他完成了,它不应该在问题中被称为 M-N。 +1
我改了问题。还是不行。我想要的是让person.getAddress()
正确排序列表。但它没有以上是关于JPA 2:通过不在带有额外字段的多对多中工作来订购的主要内容,如果未能解决你的问题,请参考以下文章