我有一个用国家实体映射的userAccount实体。 UserAccount类中的国家/地区映射就像这样
@ManyToOne(fetch=FetchType.EAGER)
@Fetch(FetchMode.JOIN)
@JoinColumn(name="f_country_id", nullable=true, insertable=false, updatable=false)
private Country country;
即使将fetchmode定义为Join,hibernate也会触发单独的SQL Select以获取国家/地区。
答案 0 :(得分:17)
删除fetch=FetchType.EAGER
。 Eager fetching触发级联select语句。
答案 1 :(得分:10)
Satadru Biswas在之前的评论中给出了答案。
当您使用Query接口(Session.createQuery)时,Hibernate 3.x会忽略FetchMode注释,因此在这种情况下,您必须将INNER JOIN FETCH子句添加到查询的FROM部分。
然而,条件界面将正确使用此界面。
答案 2 :(得分:5)
我尝试在所有api(JPQL和CriteriaBuilder)中使用@Fetch(FetchMode.JOIN)hibernate注释,但是没有用。 只有服务类中的代码可以正常工作:
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<UserAccount > cq = cb.createQuery(UserAccount.class);
Root<UserAccount> o = cq.from(UserAccount.class);
o.fetch("country",JoinType.INNER);
em.createQuery(cq.select(o)).getResultList();
答案 3 :(得分:0)
我正在使用条件查询来获取客户。
public class PurchaseOrder
{
.....
.....
@ManyToOne(fetch=FetchType.EAGER, optional=true)
@JoinColumn(name="ReportingCustomer_ID", nullable=true, insertable=false, updatable=false)
@Fetch(FetchMode.JOIN)
@NotFound(action=NotFoundAction.IGNORE)
public ReportingCustomer getReportingCustomer()
{
return reportingCustomer;
}
}
获得PurchaseOrder时,它会执行LEFT OUTER JOIN,如下所示
select ... from PurchaseOrder this_ left outer join ReportingCustomer reportingc2_
on this_.ReportingCustomer_ID=reportingc2_.ReportingCustomer_ID
where ...
我使用“Progress”驱动程序连接到DB。我不确定为什么它只在场景2中触发m + 1个查询。