2015-08-14 28 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? –

相关问题