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不會甚至執行)。
我該如何做到正確的事情?
經過多次嘗試,我懷疑這是可能的普通休眠,因爲你試圖強制它聲明'bs'空即使有*關聯,創建數據庫和ORM表示之間的斷開連接。雖然愛被證明是錯誤的。 – mabi
我從來沒有嘗試過,但從手冊[@Filter](http://docs.jboss.org/hibernate/orm/4.2/manual/en-US/html_single/#d5e8634)* may * help you ? – mabi