【问题标题】:Optimize a query in hibernate with Criteria (avoid unnecessary joins)使用 Criteria 在休眠中优化查询(避免不必要的连接)
【发布时间】:2013-03-12 14:45:00
【问题描述】:

我有一个班级A,里面还有另一个班级B。像这样的:

@Table(name = "A")
Class A {
    @OneToOne
    @JoinColumn(name="B_ID")
    B b;
} 

我想要这样的查询:

SELECT * from A where B_ID = 4

但是当我使用Criteria 来实现我的目标时,它内连接这两个表。正如我所说的那样,我怎样才能拥有SELECT


如果有帮助,我的标准是这样的:
DetachedCriteria crit = DetachedCriteria(A.class, "a");
crit.createAlias("a.b", "b");
crit.add(Restrictions.eq("b.id", 4));
getHibernateTemplate().findByCriteria(crit);

【问题讨论】:

    标签: java sql hibernate criteria


    【解决方案1】:

    默认情况下,Hibernate 会急切地获取一对一关系 - 这就是您获得内部连接的原因。试试这个:

    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn(name="B_ID")
    B b;
    

    【讨论】:

    • 所以你是说如果我建立关系LAZY,问题就解决了?
    • 如果它不能解决问题,我会感到非常惊讶。 Hibernate 应该足够聪明,知道您不想加载对象 B,并且您只关心存储在支持对象 A 的表上的 ID。
    • 这不是答案。我已将关系设置为LAZY,但只要有createAlias,就会有inner-join
    【解决方案2】:

    【讨论】:

      猜你喜欢
      • 2012-09-30
      • 1970-01-01
      • 2012-02-01
      • 1970-01-01
      • 2017-11-25
      • 1970-01-01
      • 2011-07-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多