Java 如何在JPQL中执行即时获取
我想知道在JPQL中(不是实体映射)如何显式地获取相关字段 我有Java 如何在JPQL中执行即时获取,java,jpa,jpql,Java,Jpa,Jpql,我想知道在JPQL中(不是实体映射)如何显式地获取相关字段 我有ContactAddressLink(为了简洁起见取出了注释) class ContactAddressLink{ 接触; 地址; …一些额外的字段。。。 } 所以我有一个问题要问 select cal from Contact c, Address a, ContactAddressLink cal where cal.contact = c and cal.address = a 这给了我一个我期待的问题。但是,因为我会在看
ContactAddressLink
(为了简洁起见取出了注释)
class ContactAddressLink{
接触;
地址;
…一些额外的字段。。。
}
所以我有一个问题要问
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
我记得看到过类似的东西,但我记不起确切的语法。是的。你是对的。语法是
[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
如果要匹配联系人地址链接
,如果它有联系人
/地址
,请使用内部连接获取
如果您想匹配
联系人地址链接
,即使它没有联系人
/地址
,请使用左连接获取
记住,按照JPA规范
所有@OneToOne
和@ManyToOne
都是急切获取的。您应该将其更改为lazy,否则,您将始终获取这些对象 我在想这是一个FETCH JOIN
或类似的东西,假设我不想要联系人(只是地址),我在ca1之前拿出FETCH
。联系人c?是的。如果您希望您的匹配条件完全不受联系人的影响
,您甚至可以取出内部连接获取校准。联系人c
。如果您只是不想急于获取联系人
,但仍然希望匹配具有联系人
的联系人地址链接
,您可以只取出单词获取
。刚刚尝试过,不幸的是,在我进行跟踪时,仍然为每个相关表提供单独的查询。我认为这可能只是实现的一个限制,而不是说明它应该已经获取的规范。很有趣。你用冬眠还是日食?将那些to-one字段中的@ManyToOne
的fetchType设置为LAZY还没有?我通过Spring数据JPA使用Hibernate。没有“反向映射”,所以没有@ManyToOne,但我使用@OneToOne
。Java实体中没有定义FetchType,不管怎样,根据规范,它应该可以工作,但看起来不是这样。我希望它能够快速地获取。然而,我希望JPA在一个SQL调用中获取它们。现在它进行了几个SQL调用。