对 JPQL 实体列表进行排序

标签 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 查询,以便可以获得已针对这些列之一进行排序的 Person 对象列表?我的“SELECT DISTINCT”实现:

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

不起作用,因为结果表需要对列进行排序(这是无效的,因为它导致列表不符合 Person 对象列表的条件),而且我似乎无法使用嵌套 SELECT 语句来生成结果集,然后从中提取 Person 对象的列表。有什么简单的方法可以做到这一点吗?

最佳答案

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

查看任何 Hibernate 示例(作为突出的 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

关于对 JPQL 实体列表进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8249467/

相关文章:

c# - List<T> 的多列并行排序

orm - DDD : subclasses & root entities

java - 表 'USER' 上的 DELETE 导致外键违规

angular - 在 Angular 应用程序中从后端创建数据模型何时有用?

java - 通用可比较合并排序算法的 Stackoverflow 错误

python - 如何从 python 子进程调用 LC_ALL=C 排序

mysql - 如何使用 JOIN 和 WHERE 语句过滤记录?

mysql - 选择一个表中的 ID 存在于一个或多个其他表中的记录

python - Pandas "join"奇怪

java - 试图在数组中找到最小值