【发布时间】:2016-07-05 20:13:30
【问题描述】:
我使用 JPA 2.0 标准生成器。我需要从一个表中获取数据并按列对它们进行排序。此表具有 OneToMany 关系:
class Club{
@OneToMany(mappedBy = "club")
private List<Address> addresses;
...
}
class Address{
@JoinColumn(name = "club_id", referencedColumnName = "id")
@ManyToOne(fetch = FetchType.LAZY)
private Club club;
@Column(name = "type")
private Long type;
@Column(name = "full_address")
private String full_address;
...
}
可能是某种类型的多个地址,但我只需要该特定地址的一行。
我用子查询编写本机查询,但它有问题,因为子查询在 JPA 2.0 中的 order 子句和 select 子句中没有使用。
select c.full_name from club c
ORDER BY (select a.full_address from address a WHERE c.id= a.club_id and a.type=1 LIMIT 1)
select c.full_name, (select a.full_address from address a WHERE a.type=1 AND c.id=a.club_id LIMIT 1) as full_address FROM club c
ORDER BY fullAddress;
如何在 JPA 等效项上替换原生 order by 子句?
谢谢!
【问题讨论】:
-
俱乐部是否有可能拥有许多地址并以不确定的方式排列?否则,您的 JPA 提供程序可能允许您在 from 子句中使用子查询,就像一个表一样。但是,如果您修改查询以提供您想要的内容可能会更好 - 大概是按地址排序的不同全名。类似于“从俱乐部 c 中选择 c.full_name 加入 c.addresses a where a.type =1 order by a.full_address”
-
感谢您的回答。一个俱乐部可以包含多个类型为 1 的地址,因此在使用
join时会出现俱乐部的重复。我需要获取所有俱乐部(如果存在类型为 1 或否的地址)并对其进行排序。 -
添加一个不同的关键字,但如果类型 1 不是唯一的,我不太明白如何使用子查询对非唯一地址进行排序。
标签: jpa subquery one-to-many