2015-08-14 32 views
6

我正在使用Spring開發webapp & Hibernate。Hibernate - 有沒有辦法將2列加入1?

表1:BaseTable

+------------+--------------+------+-----+---------+----------------+ 
| Field  | Type   | Null | Key | Default | Extra   | 
+------------+--------------+------+-----+---------+----------------+ 
| Id   | bigint(20) | NO | PRI |   | auto_increment | 
| Serial1 | varchar(255) | YES |  | NULL |    | 
| Serial2 | varchar(255) | YES |  | NULL |    | 
| ModelNum | varchar(255) | YES |  | NULL |    | 
| ...  | ....   | .. | 0 |   |    | 
+------------+--------------+------+-----+---------+----------------+ 

表2:DetailTable

+------------+--------------+------+-----+---------+----------------+ 
| Field  | Type   | Null | Key | Default | Extra   | 
+------------+--------------+------+-----+---------+----------------+ 
| Id1  | varchar(20) | NO | PRI |   |    | 
| Id2  | varchar(20) | NO | PRI |   |    | 
| Id3  | varchar(20) | NO | PRI |   |    | 
| Serial  | varchar(255) | YES |  | NULL |    | 
| ...  | ....   | .. | 0 |   |    | 
+------------+--------------+------+-----+---------+----------------+ 

我需要加入基於連續的表。在Table2中的Serial可以包含來自Serial1Serial2的值,從Table1,因此它應該像OR運算符那樣比較。我爲表使用hbm.xml。沒有註釋映射。我用這個查詢之前

<one-to-one name="notes" 
    class="Notes" entity-name="Notes"> 
</one-to-one> 

SELECT A.* FROM Table2 As a INNER JOIN Table1 As b 
ON (a.Serial = b.Serial1 or a.Serial = b.Serial2); 

我通過這個http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/associations.html去,但只使用了1鍵列我加入表等。

如何在這種情況下使用HBM.XML加入?可能嗎?

+1

示例:T1.Serial1包含A,T1.Serial2包含B表2的串行A有兩個行,一個串行B?你預期的結果是什麼?您可能希望兩次加入同一個表並將別名結果別名,但我可能是錯的...'select * from table1 T1 LEFT JOIN table2 T2a on T1.Serial1 = T2a.Serial LEFT JOIN table2 T2b on T1.Serial = T2b.Serial'這將把表2合併爲一行。使用一個OR,你會得到多個行,每個table1 ID ......這可能是你想要的......因此需要看到預期的結果。 – xQbert

+0

它應該選擇兩行。 –

+0

@xQbert:我已經添加了我正在使用的查詢。我想用Java代碼來代替Query,這個代碼的意思是Spring/Hibernate –

回答

1

解決方案1 ​​

創建於暴露的外鍵引用Table2Table1數據庫視圖。從您發佈的查詢中投影外鍵,您將使用該外鍵作爲視圖。然後將您的實體映射到視圖。

解決方案2

使用join formula

例如,映射到Table1實體定義映射到Table2實體許多-to-one關聯(好像是你的使用情況) :

@ManyToOne 
@JoinColumnsOrFormulas({ 
     @JoinColumnOrFormula([email protected](value="(SELECT t2.serial FROM Table2 t2 WHERE serial1 = t2.serial OR serial2 = t2.serial)", referencedColumnName="serial")) 
    }) 
private Entity2 entity2; 

但是,連接公式似乎是非常脆弱的Hibernate暫時(我設法使這項工作只爲許多-t o-one協會,我不得不讓Entity2實施Serializable;否則它不起作用,並拋出一些奇怪的NullPointer-ClassCastException s)。

+0

儘管我沒有使用註釋,並且所有映射都基於xml,但這似乎是一個可行的選項。感謝你的回答。 –

1

您需要使用本機查詢爲此

String sql = "SELECT A.* FROM Table2 As a INNER JOIN Table1 As b " 
      + " ON (a.Serial = b.Serial1 or a.Serial = b.Serial2);"; 
SQLQuery query = session.createSQLQuery(sql); 
query.addEntity(Table2.class); 
List<Table2> tableContent = query.list(); 
+0

我目前使用的代碼非常相同。只是我想用對象替換Query。有沒有辦法加入2列vs 1使用hbm.xml? –

相關問題