Я работаю над проектом Java EE 6 (EJB 3.1, JSF 2, JPA 2) уже некоторое время, и я не могу найти хороший способ сортировки динамических локализованных данных.Под динамически локализованными данными я имею в виду созданный пользователем объект с именем на одном или нескольких языках.Чтобы быть более конкретным, представьте таблицу базы данных с именем X, содержащую только идентификатор (есть больше столбцов с, это просто для упрощения), другую таблицу, содержащую доступные языки, и одну таблицу, связывающую их вместе, для каждого из которых ставится имя в Xlanguage.
[x]
id integer PRIMARY KEY
[lang]
id integer PRIMARY KEY
[x_names]
x_id integer FOREIGN KEY REFERENCES x.id
lang_id integer FOREIGN KEY REFERENCES lang.id
name
PRIMARY KEY (x_id, lang_id)
[X.java]
@Id private Integer id;
@OneToMany(mappedBy="x", cascade=CascadeType.ALL, orphanRemoval=true)
private List<XName> names;
Теперь я хотел бы представить эти объекты, отсортированные по имени (при сохранении модели MVC) для пользователя на языке, выбранном этим пользователем.Если у x-объекта отсутствует имя на этом языке, должно быть показано имя языка по умолчанию.У X-объектов всегда будет имя по крайней мере на одном языке (хотя нет никакой возможности указать эту базу данных).
Сортировка Java кажется неуместной, поскольку x-сущность не должна знать, чтов настоящее время используется язык, и поэтому CompareTo не может выполнять свою работу, поэтому кажется, что сортировка в базе данных имеет смысл.Моя первая идея выглядела примерно так:
SELECT DISTINCT x FROM X x LEFT JOIN x.names n ORDER BY n.name
Это, однако, не имеет смысла, так как язык не указан, иногда он будет сортировать по одному языку, иногда по другому.
Это лучшее, что яя смог придумать:
SELECT DISTINCT x FROM X x LEFT JOIN x.names n LEFT JOIN n.language l ORDER BY l.id, cn.name
, который мог бы работать теоретически, всегда выбирая имена с самым низким языковым идентификатором, позволяя мне работать в приоритетном порядке таким образом.Проблема в том, что DISTINCT не работает, я получаю один x-объект для каждого имени в системе.Могу ли я, возможно, отправить выбранный язык на слой модели и каким-то образом использовать его, получая при этом ВСЕ объекты х, а не только те, у которых есть язык?Любые идеи будут оценены.
Логика всего этого для представления, где пользователь может упорядочивать эти x-объекты и легко вводить имя на любом и на всех языках, все еще видя x-объекты, даже еслиу них нет имени на языке пользователя, чтобы их можно было добавить.
Поставщик JPA - EclipseLink.