Java 在hibernate中使用条件优化查询(避免不必要的联接)

Java 在hibernate中使用条件优化查询(避免不必要的联接),java,sql,hibernate,criteria,Java,Sql,Hibernate,Criteria,我有一个类a,里面有另一个类B。大概是这样的: @Table(name = "A") Class A { @OneToOne @JoinColumn(name="B_ID") B b; } SELECT * from A where B_ID = 4 DetachedCriteria crit = DetachedCriteria(A.class, "a"); crit.createAlias("a.b", "b"); crit.add(Restrictions.e

我有一个类
a
,里面有另一个类
B
。大概是这样的:

@Table(name = "A")
Class A {
    @OneToOne
    @JoinColumn(name="B_ID")
    B b;
} 
SELECT * from A where B_ID = 4
DetachedCriteria crit = DetachedCriteria(A.class, "a");
crit.createAlias("a.b", "b");
crit.add(Restrictions.eq("b.id", 4));
getHibernateTemplate().findByCriteria(crit);
我想要一个这样的查询:

@Table(name = "A")
Class A {
    @OneToOne
    @JoinColumn(name="B_ID")
    B b;
} 
SELECT * from A where B_ID = 4
DetachedCriteria crit = DetachedCriteria(A.class, "a");
crit.createAlias("a.b", "b");
crit.add(Restrictions.eq("b.id", 4));
getHibernateTemplate().findByCriteria(crit);
但是当我使用
Criteria
来实现我的目标时,它内部连接了这两个表。我怎样才能像我说的那样选择


如果有帮助,我的标准如下:

@Table(name = "A")
Class A {
    @OneToOne
    @JoinColumn(name="B_ID")
    B b;
} 
SELECT * from A where B_ID = 4
DetachedCriteria crit = DetachedCriteria(A.class, "a");
crit.createAlias("a.b", "b");
crit.add(Restrictions.eq("b.id", 4));
getHibernateTemplate().findByCriteria(crit);

默认情况下,在Hibernate中,一对一关系会被急切地获取,这就是为什么您会得到一个内部连接。试试这个:

@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name="B_ID")
B b;
从。这似乎是冬眠中一个长期存在的错误


这个问题也让我很困惑。

那么你是说如果我把关系设为懒惰的
,问题就会解决?如果它不能解决问题,我会非常惊讶。Hibernate应该足够聪明,知道您不想加载对象B,只关心存储在支持对象A的表上的ID。这不是答案。我已经将关系设置为
LAZY
,但是,只要存在
createAlias
就存在
内部连接