【发布时间】:2016-06-07 09:51:55
【问题描述】:
我的实体如下所示:为简化起见,我只显示了两个字段。我们决定一次性加载所有属性。
@Entity
public class Person{
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
private Set<PhoneNumber> phoneNumbers = new HashSet<>(0);
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "AGENCY_ID")
private Agency agency;
左连接:(这会返回重复记录。)
select person
from Person person left join person.agency ag left join person.phoneNumbers
where upper(person.name) LIKE '%SU%' and upper(person.status.rcode) = 'ACTIVE'
order by person.agency.name asc, person.id asc
left join with distinct : 这给出了“ORA-01791: not a SELECTed expression”,因为我在 order 子句中使用了机构字段。
select distinct person
from Person person left join person.agency ag left join person.phoneNumbers
where upper(person.name) LIKE '%SU%' and upper(person.Status.rcode) = 'ACTIVE'
order by person.agency.name asc, person.id asc
left join fetch :这工作正常,没有重复。但对拉动 2000 人的记录有很大的影响。大约需要 15 秒,而仅左加入则需要 1 秒。
select person
from Person person left join fetch person.agency ag left join fetch person.phoneNumbers
where upper(person.name) LIKE '%SU%' and upper(person.Status.rcode) = 'ACTIVE'
order by person.agency.name asc, person.id asc
获取所有属性:没有重复。表现更好。但是.. 当我尝试像下面这样查询一个人时(此人没有任何代理):它返回人员记录(这意味着它正在执行左连接)。
select person
from Person person
fetch all properties
where upper(person.name) LIKE '%SU%' and upper(person.status) = 'ACTIVE'
order by person.id asc
但是当我在下面做时,我没有取回这个人的记录。 (不同之处是按子句顺序添加了代理字段,在这种情况下似乎没有进行左连接。)
select person
from Person person
fetch all properties
where upper(person.name) LIKE '%SU%' and upper(person.status) = 'ACTIVE'
order by person.agency.name asc, person.id asc
我正在寻找的是避免重复,可按表现良好的人的所有领域进行排序。
【问题讨论】:
-
JPA 中没有“获取所有属性”这样的语法。