2014-09-26 2 views
4

Есть 3 таблицы:Hibernate @ManyToMany joinTable - OrderBy используя присоединиться поле таблицы

TABLE_A
ID_A
field1
fieldN

TABLE_B
ID_B
field1
fieldN

TABLE_A_B
ID_A
ID_B
orderField

public class A(){ 
    @ManyToMany 
    @JoinTable(name="TABLE_A_B", joinColumns={@JoinColumn(name="ID_A")}, inverseJoinColumns={@JoinColumn(name="ID_B")}) 
    @OrderBy(value="orderField") 
    private List<TABLE_B> BList; 
} 

Но это не работает, вместо этого я получаю сообщение об ошибке выполнения:

Caused by: org.postgresql.util.PSQLException: ERROR: column B1_.orderField doesn't exist Position: 1437 

Hibernate ищет поле в TABLE_B. Можно ли использовать «OrderBy» во многих отношениях, используя поле таблицы соединений? Или любой другой способ получить заказ на основе одной и той же области?

ответ

8

Ваш код верный, вы попробовали это, он будет работать. Одна из проблем заключается в том, что вы используете list, так что, хотя у вас есть этот список в кеше, вероятно, не будет сортироваться, но если вы очистите текущий сеанс и извлечете его снова, он будет упорядочен, когда вы установите @OrderBy(value="orderField").

Также существует другая проблема с @OrderBy относительно спящего режима documentation;

Lists can be mapped in two different ways:

  • as ordered lists, where the order is not materialized in the database
  • as indexed lists, where the order is materialized in the database

To order lists in memory, add @javax.persistence.OrderBy to your property.

Но я просто попытался вашу проблему и запрос на базе данных имеет порядок по параметру (hibernate.show_sql=true), так что я не уверен, что они имели в виду с верхним утверждением.

Мой пример запроса;

select ... from ... inner join ... where users0_.event_id=? order by user1_.fullname 

Я закончу, если заказ сделан на базе данных, то вы можете смело использовать @OrderBy аннотацию.

ОБНОВЛЕНИЕ:

@OrderBy должны иметь родное значение SQL, например;

@OrderBy(value="orderField") 
private List<TABLE_B> BList; 

где orderField это имя базы данных столбца в таблице TABLE_B, также можно сделать это @OrderBy(value="lower(fullname) desc")

Если вы хотите создать столбец присоединиться TABLE_A_B который держит такой же порядок, как в вашем списке в java, тогда вы должны использовать @OrderColumn(name="orderField")

Попробуйте это;

@ManyToMany 
@JoinTable(name="TABLE_A_B", joinColumns={@JoinColumn(name="ID_A")}, inverseJoinColumns={@JoinColumn(name="ID_B")}) 
@OrderColumn(name="orderField") 
private List<TABLE_B> BList; 
+0

спасибо за ваш ответ, но пример, который я опубликовал, не работает. У меня ошибка времени выполнения: 'Caused by: org.postgresql.util.PSQLException: ОШИБКА: столбец B1_.orderField не существует Позиция: 1437' –

+0

Посмотрите на обновление. –

+0

Я хочу знать, можно ли использовать поле таблицы соединений, чтобы заказать значения. Я обновил свой вопрос. –

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