排序JPQL实体列表

时间:2011-11-23 21:42:51

标签: sorting join entity jpql

我长时间努力寻找答案,但到目前为止我还没有运气。我正在尝试通过JPQL查询检索和排序对象列表,但由于查询本身在不同的表之间使用了很多连接,因此非常困难。

基本上,我们有一个带有字段

的实体“Person”
String name
List<Telephone> phones
List<Email> emails
List<Address> addresses

“电话”,“电子邮件”和“地址”都是单独的实体,每个实体都包含自己的数据,如字符串字段“数字”或类似的东西(Address.street,Address.state)。所以这四个对象都是数据库中的表。

我希望用户能够按任何特定数据对人员列表进行排序。现在,我想按以下任意一种排序:人名,电子邮件列表中的第一个电子邮件地址,街道或该人的第一个地址的状态,依此类推。因此,如果人员列表如下:

Name     Phone Number        Street          State
Mack     555-1234            1 Main Street   WA
Andy     222-9999            2 Other Way     RI
Wendy    222-3333            3 Wrong Way     UT

我希望表按州排序,列表应为:

Name     Phone Number        Street          State
Andy     222-9999            2 Other Way     RI
Wendy    222-3333            3 Wrong Way     UT
Mack     555-1234            1 Main Street   WA

我希望使用JPQL查询来完成此操作,以便在将列表提供给Web服务器以优化性能时对列表进行过滤和排序。我还必须补充一点,我正在实施一个搜索功能,搜索特定术语的所有这些“列”。

长话短说,我如何编写一个JPQL查询,以便a可以获取已为其中一列排序的Person对象列表?我执行“SELECT DISTINCT”:

SELECT DISTINCT x FROM Person x, IN(x.phones) phones ORDER BY phones.number

不起作用,因为结果表需要对列进行排序(这是无效的,因为它导致列表不符合Person对象的列表),我似乎无法使用嵌套的SELECT语句生成结果集,然后从中拉出Person对象列表。有没有简单的方法呢?

1 个答案:

答案 0 :(得分:2)

我很抱歉,但我必须不同意。在JPQL中,您可以(!)对结果集进行排序,而不在结果中包含已排序的列。

请参阅任何Hibernate示例(作为promonent JPQL实现)。

如果我不理解,请告诉我


SELECT DISTINCT p FROM Person p 
                   JOIN p.addressList adr 
                   JOIN p.emailList eml 
                   JOIN p.phoneList phn
ORDER BY p.name, eml.emailAddress, phn.phoneNumber