Сортировка динамически локализованных данных - PullRequest
0 голосов
/ 21 февраля 2011

Я работаю над проектом 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.

1 Ответ

0 голосов
/ 22 февраля 2011

Теперь я понимаю, что сортировка на уровне контроллера имеет больше смысла и полностью пропускает сортировку базы данных.Я только что понял, что вы можете реализовать свой собственный компаратор с Collections.sort, который может иметь доступ к выбранному языку и сортировать после него.

...