Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > order by


Автор: goodday1941 23.7.2009, 12:53
ситуация следующая (без лишних аннотация и полей):
Код


class A{
    @OneToMany(fetch = FetchType.EAGER, targetEntity = XMLField.class, cascade = {CascadeType.ALL})
    @JoinColumn(name="b_id")
    @Fetch(value = FetchMode.SUBSELECT)
    @OrderBy(value = "c.sortOrder asc")
    
    // или @OrderBy(value = "sortOrder asc")
    private List<B> bs = new ArrayList<B>();
}


class B{
    @ManyToOne    
    @JoinColumn(name = "c_id")
    private C c;
}

class C {
private int sortOrder; 
}



нужно отсортировать коллекцию в классе A по полю sortOrder в классе С..

как это сделать.. ни первый ни второй вариант с OrderBy не прокатывает (

Автор: Maksym 23.7.2009, 15:25
goodday1941
Не уверен что это должно заработать хоть в каком-нибудь виде.
В спецификации JPA, по крайней мере, такое сложное поведение для этой анотации не предусмотрено.
Все что там сказано: 
Цитата
The property or field name must correspond to that of a persistent property or field of the associated class.

Ни о какой обработке вложенности они даже не заикаются.

Автор: jeank 23.7.2009, 15:42
c @OrderBy все должно работать, скорее где то ошибка или баг. На чем все пробуется - Хибернейт, Топлинк, ...? Попробуй сменить фрейворк (временно).

А вот теперь засомневался, что работает - увидел, что сортируемое поле в другом классе, такая ситуевина не встречалась.

Автор: MisterCleric 23.7.2009, 16:12
Если hibernate, то можно через @Formula достать это поле вложенный запросом в сущности B
Код

@Formula("(SELECT c.sortOrder FROM C_TABLE c where c.id = c_id")
private int sortOrder; 


другого выхода не вижу...

Автор: goodday1941 23.7.2009, 17:05
хибернейт хибернейт...

с аннотацией формула пока не сталкивался... сейчас посмотрю в этом направлении

Автор: goodday1941 23.7.2009, 17:23
все работает! всем спасибо за ответы!

Автор: VSergeyV 14.8.2009, 07:17
У меня тоже вопрос по Order By, использую Toplink
Есть три сущности, две из них имеют отношение многие ко многим, третья - таблица связки
Код

class T1{
   private int id;
   private Collection<T2> t2s;

   @OneToMany
   @JoinTable(name = "AC", joinColumns = @JoinColumn(name = "T1_ID"), inverseJoinColumns = @JoinColumn(name = "T2_ID"))  
   //@OrderBy(value = "AT.SORT_ORDER")  ???
   public Collection<T2> getT2s() {
        return t2s;
    }
}
class T2{    
    private int id;
}
class AT {
    private int t1_id; 
    private int t2_id; 
    private int sort_order; 
}


@OrderBy(value = "AT.SORT_ORDER")  - как сделать чтобы Collection<T2> t2s была упорядочена по SORT_ORDER из таблицы связки AT?


Автор: VSergeyV 14.8.2009, 13:31
Как вообще можно повлиять на тот запрос который будет выполняться для OneToMany? к примеру мне нужно отсортировать по SORT_ORDER и взять первые 5 значений
Неужели никак? Отказался от ManyToMany/JoinTable, мучу через NamedNativeQuery smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)