我有一個人類有一個字符串集合的別名代表人可能會經過的額外名稱。例如,克拉克肯特可能會有別名「超人」和「鋼鐵俠」。德懷特霍華德也有一個「超人」的別名。是否有可能爲Hibernate sqlRestriction獲取連接表的SQL別名?
@Entity
class Person {
@CollectionOfElements(fetch=FetchType.EAGER)
Set<String> aliases = new TreeSet<String>();
Hibernate在我的數據庫Person和Person_aliases中創建了兩個表。 Person_aliases是一個包含Person_id和元素的連接表。比方說,Person_aliases具有以下數據
--------------------------------
| Person_id | element |
--------------------------------
| Clark Kent | Superman |
| Clark Kent | Man of Steel |
| Dwight Howard | Superman |
| Bruce Wayne | Batman |
--------------------------------
我想爲誰是「超人」的別名全力以赴的人休眠條件查詢。
由於在這裏列出的原因太長,我真的希望將此作爲Criteria查詢,而不是HQL查詢(除非可以在Criteria對象上添加HQL限制,在這種情況下,我全是耳朵)或原始SQL查詢。由於根據How do I query for objects with a value in a String collection using Hibernate Criteria?,使用CriteriaAPI引用值類型集合的元素是不可能的,我想我會在我的criteria對象上添加一個SqlRestriction。
Criteria crit = session.createCriteria(Person.class);
crit.add(Restrictions.sqlRestriction("XXXXX.element='superman'");
在Hibernate會創建一個像
select *
from
Person this_
left outer join
Person_aliases aliases2_
on this_.id=aliases2_.Person_id
where
XXXXX.element='superman'
但是SQL語句的希望
,我需要填寫XXXXX在SQL查詢表別名Person_aliases表,在這個情況會是'aliases2_'。我注意到,如果我需要引用Person表別名,我可以使用{別名}。但是這不起作用,因爲Person是這個標準的主要表格,而不是Person_aliases。
我爲XXXXX填寫什麼?如果沒有像{alias}這樣好的替換標記,那麼是否有辦法讓hibernate告訴我該別名會是什麼?我注意到了一個名爲generateAlias()org.hibernate.util.StringHelper類的方法。這會幫助我預測別名會是什麼?
我真的很想避免硬編碼'aliases2_'。
謝謝你的時間!
感謝您的回覆 - 實際上,由於之前的堆棧溢出問題,我確實知道不幸的Criteria API限制,但希望通過sqlRestriction使用本機SQL代碼段可能會提供一個「黑客」,讓我們仍然使用Criteria。但我找不到一種方法來獲取對連接表名稱的引用。如果沒有辦法,我會像你所建議的那樣訴諸HQL。然而,有些理由我不想要這將需要更多的空間比我在這裏解釋(這個問題是我們的實際查詢的簡化表示) – 2010-03-01 17:14:25
@Jason也許這是可能的,但*我*看不到如何沒有硬編碼表名。 – 2010-03-01 17:20:28