Java JPA 2:通过不在多个具有额外字段的多个中工作来订购

Java JPA 2:通过不在多个具有额外字段的多个中工作来订购,java,hibernate,jpa,jpa-2.1,hibernate-5.x,Java,Hibernate,Jpa,Jpa 2.1,Hibernate 5.x,我有很多这样的地图 请注意,为了简单起见,我删除了样板文件 @Entity class Person { @OneToMany(mappedBy = "person") @OrderBy("sort") private List<PersonAddress> adresses = new ArrayList<>(); } @Entity class PersonAdress { @EmbeddedId private Pers

我有很多这样的地图

请注意,为了简单起见,我删除了样板文件

@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;
}
我也尝试过:

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
Person-Person=entityManager.find(Person.class,personId);

person.getAddress()//是否尝试了以下查询:

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

有关更多信息,请参阅HQL。

首先,您的映射是错误的:您想在Person和Address之间建立多对多关联吗?这就是为什么你中间有那个人物地址实体?

  • 在课堂上,应该是:

    @OneToMany(mappedBy=“person”)
    private List=new ArrayList()

  • 在班级地址中,应为:

    @OneToMany(mappedBy=“address”)
    私有列表PersonalAddresses=newArrayList()


只有这样,您的排序才会起作用,因为它是PersonalAddress实体的成员

我尝试过,但它不起作用。我的地址顺序不对。虽然很奇怪,因为select看起来是正确的。我的映射不是错误的。你看过我贴的链接了吗?PS:我的人和地址不是我真正的实体,只是我用来说明我的问题的东西来吧,这是一个多对多的。。。并且你的PersonalAddress在你的映射中没有链接到任何东西。。。我仍然认为你的映射是错误的!工作sql:
从Person p中选择p,其中p.id=pid join-fetch p.personaddress pa join-fetch pa.address按pa.sort处理订单确实是错误的。如果他有一个M-N并且想要一个额外的列,那么他应该有2个1-N来表示PersonalAddress。此外,一旦他这样做了,就不应该在问题中称为M-N+1我改变了问题。但还是不行。我想要的是使用
person.getAddress()
对列表进行正确排序。但是它并没有让你真正看到被调用的SQL吗?对于这2个1-N关系。此外,正如第一个答案所说,您的映射是错误的。
Select p From Person p Left Join p.adresses a Where p.id = :pid Order By a.sort