如何在JPQL中执行EAGER提取

时间:2019-06-07 04:33:46

标签: java jpa jpql

我想知道在JPQL中(而不是在实体映射上)如何急切地显式获取关联字段。

我有ContactAddressLink(为简洁起见,请注意注释)

class ContactAddressLink {
  Contact contact;
  Address address;
  ... some extra fields ...
}

所以我有一个查询

select cal from Contact c, Address a, ContactAddressLink cal where
cal.contact = c and cal.address = a

哪个给了我我期望的查询。但是,由于我会在看到一堆查询获取每个地址之后使用这些地址。

我想做的是

select cal eager fetch cal.a from Contact c, Address a, ContactAddressLink cal where
cal.contact = c and cal.address = a

我记得看到过类似的东西,但是我不记得确切的语法。

2 个答案:

答案 0 :(得分:2)

是的。你是对的。语法为[inner|left] join fetch。示例:

select cal from ContactAddressLink cal
inner join fetch cal.contact c
inner join fetch cal.address a
where cal.id = 123456789

如果要匹配ContactAddressLink / Contact,请使用Address

如果即使没有inner join fetch / ContactAddressLink,也要匹配Contact,请使用Address

答案 1 :(得分:0)

请记住,JPA Specification@OneToOne都被急切获取。如果没有,则应将其更改为惰性,否则将始终获取那些对象。