Eclipselink упорядоченно считывает сложную объектную модель

Мне нужно прочитать сложную модель в упорядоченном виде с помощью eclipselink. Порядок является обязательным, потому что это огромная база данных, и я хочу получить вывод небольшой части базы данных в виде таблицы jface. Попытка переупорядочить его в потоке загрузки/запроса занимает слишком много времени, а его заказ в LabelProvider блокирует поток пользовательского интерфейса слишком много времени, поэтому я подумал, что если Eclipselink можно использовать таким образом, база данных упорядочит его, это может дать мне нужная мне производительность. К сожалению, модель объекта изменить нельзя :-(

Модель примерно такая:

@SuppressWarnings("serial")
@Entity
public class Thing implements Serializable {
     @Id
     @GeneratedValue(strategy = GenerationType.TABLE)
     private int id;
     private String name;
     @OneToMany(cascade=CascadeType.ALL)
     @PrivateOwned
     private List<Property> properties = new ArrayList<Property>();
     ...
     // getter and setter following here
}
public class Property implements Serializable { 
    @Id
    @GeneratedValue(strategy = GenerationType.TABLE)
    private int id;

    @OneToOne
    private Item item;

     private String value;
     ...
     // getter and setter following here
}
public class Item implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.TABLE)
    private int id;
    private String name;
     ....
     // getter and setter following here    
}
// Code end

В представлении таблицы ось Y более или менее создается с запросом

Query q = em.createQuery("SELECT m FROM Thing m ORDER BY m.name ASC");

используя атрибут «имя» из объектов вещи в качестве метки.

В представлении таблицы ось X более или менее создается с запросом

Query q = em.createQuery("SELECT m FROM Item m ORDER BY m.name ASC");

используя атрибут «имя» из объектов Item в качестве метки.

Каждая ячейка имеет значение

Things.getProperties().get[x].getValue()

К сожалению, список «свойства» не упорядочен, поэтому комбинация значения ячейки и номера столбца оси x (x) не обязательно верна. Поэтому мне нужно упорядочить список «свойства» так же, как я упорядочил маркировку оси X.

И именно это то, что я не знаю, как это делается. Таким образом, запрос объектов Thing должен возвращать список «свойств» «ORDER BY name ASC» но объектов «Item». Мои идеи похожи на запрос с двумя JOIN. Соединение вещей с собственностью и с предметом, но почему-то мне пока не удалось заставить его работать.

Спасибо за вашу помощь и ваши идеи, чтобы решить эту загадку.


person Raven    schedule 01.04.2010    source источник


Ответы (2)



Попробуйте аннотацию @OrderBy JPA. Что-то типа

@OrderBy('name ASC')
@OneToMany(cascade=CascadeType.ALL)
private List<Property> properties = new ArrayList<Property>();
person lexicore    schedule 01.04.2010
comment
Спасибо!! К сожалению, я получаю эту ошибку: Внутреннее исключение: исключение [EclipseLink-7217] (Eclipse Persistence Services — 2.0.1.v20100213-r6600): org.eclipse.persistence.exceptions.ValidationException Описание исключения: порядок по значению [имя], указанный для элемента [свойства] из объекта [класс Вещь] недействителен. В целевом объекте [свойство класса] нет свойства или поля с таким именем. Кажется, eclipselink еще не знает о поле имени в Item.name. - person Raven; 01.04.2010
comment
Тем не менее, я добавил @OrderBy к Item.name, и это не помогает. Eclipselink по-прежнему читает список неупорядоченным образом. :-( - person Raven; 01.04.2010
comment
Извините, неправильно понял вопрос. EclipseLink должен поддерживать @OrderBy, но в вашем случае это не поможет. - person lexicore; 01.04.2010
comment
Нет, это не так. Я придумал SQL-запрос, который работает с базой данных, но eclipselink не создает с ним мои объекты. Любые подсказки? SELECT * FROM Thing AS a JOIN Thing_Property AS b ON a.id=b.Thing_ID JOIN Property AS c ON b.properties_ID = c.id JOIN Item AS d ON c.item_ID = d.id ORDER BY a.name, d. имя - person Raven; 01.04.2010
comment
Это должно быть возможно и в JPQL, что-то вроде: SELECT * FROM Thing a JOIN a.property c JOIN c.item d JOIN ORDER BY a.name, d.name - person lexicore; 01.04.2010