Sorting 动态本地化数据排序

Sorting 动态本地化数据排序,sorting,eclipselink,jpa-2.0,java-ee-6,Sorting,Eclipselink,Jpa 2.0,Java Ee 6,我从事JavaEE6项目(EJB3.1、JSF2、JPA2)已经有一段时间了,我想不出一种对动态本地化数据进行排序的好方法。对于动态本地化数据,我指的是用户创建的对象,其名称使用一种或几种语言。更具体地说,假设一个名为X的数据库表只包含一个id(有更多列ofc,这只是为了简化它),另一个表包含可用的语言,一个表通过为每种语言在X上加一个名称将这两种语言绑定在一起 [x] id integer PRIMARY KEY [lang] id integer PRIMARY KEY [x_names

我从事JavaEE6项目(EJB3.1、JSF2、JPA2)已经有一段时间了,我想不出一种对动态本地化数据进行排序的好方法。对于动态本地化数据,我指的是用户创建的对象,其名称使用一种或几种语言。更具体地说,假设一个名为X的数据库表只包含一个id(有更多列ofc,这只是为了简化它),另一个表包含可用的语言,一个表通过为每种语言在X上加一个名称将这两种语言绑定在一起

[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;
然而,这是没有意义的,因为没有指定任何语言,它有时会在一种语言上排序,有时会在另一种语言上排序

这是我能想到的最好的:

SELECT DISTINCT x FROM X x LEFT JOIN x.names n LEFT JOIN n.language l ORDER BY l.id, cn.name
这在理论上是可行的,总是从最低的语言id中选择名称,这样我就可以按优先顺序工作。这里的问题是DISTINCT不起作用,我为系统中的每个名称获得一个x对象。我是否可以将选择的语言发送到模型层,并以某种方式使用它,同时仍然获得所有x对象,而不仅仅是具有可用语言的对象?任何想法都将不胜感激

所有这一切的逻辑都是为了一个视图,在这个视图中,用户可以组织这些x对象,并轻松地以任何和所有语言填写名称,同时仍然可以看到x对象,即使它们在用户语言中没有名称,以便他们可以添加一个名称


JPA提供者是EclipseLink。

我现在意识到在控制器层进行排序更有意义,完全跳过数据库排序。我刚刚意识到,您可以使用Collections.sort实现自己的comparator,它可以访问当前选择的语言,然后进行排序

SELECT DISTINCT x FROM X x LEFT JOIN x.names n LEFT JOIN n.language l ORDER BY l.id, cn.name