排序动态本地化数据

时间:2011-02-21 15:41:19

标签: sorting eclipselink jpa-2.0 java-ee-6

我一直在研究Java EE 6项目(EJB 3.1,JSF 2,JPA 2)已有一段时间了,我无法找到一种排序动态本地化数据的好方法。对于动态本地化数据,我的意思是用户创建的对象具有一种或多种语言的名称。更具体地说,假设一个名为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;

现在,我想为这个用户选择的语言呈现按名称排序的这些对象(同时保留MVC模型)。如果x-object缺少此语言的名称,则应显示默认语言的名称。 X-objects总是至少有一种语言的名称(虽然没有办法明智地指定这个数据库)。

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

理论上可以使用,总是从最低语言ID中选择名称,使我能够以这种方式按优先级顺序工作。这里的问题是DISTINCT不起作用,我为系统中的每个名字得到一个x对象。我是否可以将所选语言发送到模型层并以某种方式使用它,同时仍然获得所有x对象,而不仅仅是具有可用语言的对象?任何想法都将不胜感激。

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

JPA提供程序是EclipseLink。

1 个答案:

答案 0 :(得分:0)

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