我正在使用Spring&Hibernate开发webapp。
表1:基本表
+------------+--------------+------+-----+---------+----------------+ | 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 | | | +------------+--------------+------+-----+---------+----------------+
我需要基于序列表。该Serial中Table2可能包含的值从任一Serial1或Serial2来自Table1所以应该比较喜欢OR运算符。我正在将hbm.xml用于表。没有注释映射。我加入了像这样的表:
Serial
Table2
Serial1
Serial2
Table1
<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
在上创建一个数据库视图,该视图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的时间是非常脆弱的(我设法使这项工作只为许多-to- one关联,我不得不作出Entity2执行Serializable;否则,它不工作,并投掷了一些奇怪的NullPointer-和ClassCastException为s)。
Entity2
Serializable
NullPointer-
ClassCastException