2013-12-17 81 views
2

我想這個SQL:休眠:左連接與連接表,並加入限制

select * from tableA 
left outer join joinAB on tableA.id = joinAB.a_id 
left outer join tableB on tableB.id = joinAB.b_id and tableB.otherCol = 4; 

有了這樣的模式:

class TableA { 
    @OneToMany 
    @JoinTable(
      name = "joinAB", 
      joinColumns = @JoinColumn(name = "a_id"), 
      inverseJoinColumns = @JoinColumn(name = "b_id") 
    ) 
    private Set<TableB> bs; 
} 

我想寫一個條件,將返回所有TableAs與他們的bs,但也包括沒有任何bs。因此左外連接。 tableB很大,所以otherCol實際上是一個索引列,我需要限制它以防止MySQL執行全表掃描。

我使用這個標準:

this.getSession().createCriteria(TableA.class) 
    .createAlias("bs", "bs", CriteriaSpecification.LEFT_JOIN,      
    Restrictions.eq("bs.otherCol", 4)); 

但我結束了這個SQL:

select * from tableA this_ left outer join joinAB bs5_ 
on this_.id=bs5_.a_id and (bs1_.otherCol=4) 
left outer join tableB bs1_ on bs5_.b_id=bs1_.id and (bs1_.otherCol=4) 

所以你看它的加入對聯結表中的無意義的限制(生成的SQL不會甚至執行)。

我該如何做到正確的事情?

+0

經過多次嘗試,我懷疑這是可能的普通休眠,因爲你試圖強制它聲明'bs'空即使有*關聯,創建數據庫和ORM表示之間的斷開連接。雖然愛被證明是錯誤的。 – mabi

+0

我從來沒有嘗試過,但從手冊[@Filter](http://docs.jboss.org/hibernate/orm/4.2/manual/en-US/html_single/#d5e8634)* may * help you ? – mabi

回答

1

Criteria crit = session.createCriteria(TableA.class);

crit.createCriteria(「joinAB」,「AB」,JoinType.LEFT_OUTER_JOIN);

crit.createCriteria( 「tableB的」, 「TB」,JoinType.LEFT_OUTER_JOIN,Restrictions.eq( 「TB.otherCol」, 「4」));

crit.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);