2015-09-22 1 views
0

У меня есть ManyToMany, который я отобразил как это question.JPA 2: заказ, не работающий в 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 

Можно ли определить, почему он не работает?

+0

и вы действительно посмотрели на вызов SQL? для этих 2 1-N отношений. Кроме того, как сказал 1 ответ, ваше сопоставление неверно. –

ответ

0

ли вы попробовать следующий запрос:

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

Смотрите HQL reference для получения дополнительной информации.

+0

Я пробовал, он не работает. Мои адреса неправильно упорядочены. Хотя это странно, потому что выбор выглядит правильно. –

0

Для начала ваше отображение неверно: вы хотите установить связь между человеком и адресом между многими? и именно поэтому у вас есть PersonAdress entity в середине?

  • В классе Person, он должен быть:

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

  • В классе Address, он должен быть:

    @OneToMany(mappedBy = "address") private List<PersonAddress> personAddresses = new ArrayList<>();

Только тогда, Ваш вид будет работать, поскольку он является участником PersonAddress

+0

Мое отображение не является ложным. Вы посмотрели ссылку, которую я разместил? http://stackoverflow.com/questions/23837561/jpa-2-0-many-to-many-with-extra-column PS: Моя личность и адрес не являются моими реальными сущностями, просто что-то, что я использовал для иллюстрации моей проблемы –

+0

давайте, это много-ко многим ... и ваш PersonAddress ни к чему не привязан! ... Я все еще утверждаю, что ваше отображение неверно! – Pras

+0

Рабочий sql: 'select p from Person p где p.id = pid join fetch p.personAddresses pa join fetch pa.address order by pa.sort' – Pras

Смежные вопросы