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:通过不在带有额外字段的多对多中工作来订购的主要内容,如果未能解决你的问题,请参考以下文章

openjpa:多对多,带有额外的列

带有额外列的多对多自引用原则

带有额外列的 JPA 2.0 多对多 - 更新集合

Android Room - 带有附加字段的多对多关系

带有额外列的 Spring Data JPA 多对多

如何使用 Doctrine 2 创建与额外字段的多对多自引用关联?