即使FetchMode = Join,Hibernate也会发出select语句

时间:2011-03-28 10:35:01

标签: hibernate

我有一个用国家实体映射的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以获取国家/地区。

4 个答案:

答案 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 ...
  1. 当ReportingCustomer中有条目时 - 它仅触发上述查询。
  2. 当ReportingCustomer中没有该记录的条目时 - 它会触发每个PURCHASEORDER(m + 1)个查询的查询。
  3. 我使用“Progress”驱动程序连接到DB。我不确定为什么它只在场景2中触发m + 1个查询。