Hibernate – 有没有办法将2列与1连接?
我正在使用Spring和Hibernate开发webapp。
表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
可能包含来自Table1
Serial1
或Serial2
值,因此它应该像OR运算符一样进行比较。 我正在使用hbm.xml表。 没有注释映射。 我加入了以下表:
我之前使用过这个查询:
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,但只使用了一个关键列。
如何在此方案中使用HBM.XML加入? 可能吗?
解决方案1
在Table1
上创建一个数据库视图,它暴露外键引用Table2
。 从您发布的查询中投射外键,无论如何都将用于视图。 然后将您的实体映射到视图。
解决方案2
使用连接公式 :
例如,在映射到Table1
的实体中定义与映射到Table2
的实体的多对一关联(似乎是您的用例):
@ManyToOne @JoinColumnsOrFormulas({ @JoinColumnOrFormula(formula=@JoinFormula(value="(SELECT t2.serial FROM Table2 t2 WHERE serial1 = t2.serial OR serial2 = t2.serial)", referencedColumnName="serial")) }) private Entity2 entity2;
但是,暂时加入公式似乎在Hibernate中非常脆弱(我设法使这个工作只用于多对一关联,我不得不使Entity2
实现Serializable
;否则它不起作用并抛出一些奇怪的NullPointer-
和ClassCastException
s)。
您需要为此目的使用本机查询
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 tableContent = query.list();