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