2012-05-25 32 views
1

有没有什么办法可以在没有直接关系的情况下连接两个表格,但是在hibernate中有两个共同的字段?在休眠中加入两个不相关的表格

我有两个名为boiler_plates和profile的表,它们之间没有直接关系,但有一个名为contract_id的公共字段。

我写了查询“来自Boiler_Plates bp内连接配置文件p bp.bt_contracts = p.contract_id”,但它一直抛出错误。 “ 意外标记:在第1行第75列[来自com.catapult.bid.model.Boiler_Plates作为bp内部联接概要文件,作为p在bp.bt_contracts = p.contract_id其中bp.bt_contracts = 1]”。

下面是boiler_plates和profiles的hibernate映射文件。

boiler_plates的映射文件。对于档案

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE hibernate-mapping SYSTEM "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 


<hibernate-mapping package="com.catapult.bid.model" default-access="field" > 
    <class name="Boiler_Plates" table="bt_boiler_plates" schema="bidtool"> 

     <id name="boiler_plate_id" type="int" column="boiler_plate_id">   
      <generator class="sequence"> 
       <param name="sequence">bidtool.boiler_plates_boiler_plate_id_seq</param> 
      </generator> 
     </id> 

     <property name="boilerPlateName" type="string"> 
      <column name="boiler_plate_name" length="20" not-null="true" /> 
     </property> 
     <property name="editable" type="int"> 
      <column name="editable"/> 
     </property> 
     <property name="boilerPlateContent" type="string"> 
      <column name="boiler_plate_content" length="20" /> 
     </property> 
     <property name="insertTime" type="date" insert="false"> 
      <column name="insert_time_stamp"/> 
     </property> 
     <many-to-one class="Contracts" fetch="select" name="bt_contracts"> 
      <column name="contract_id"/> 
     </many-to-one> 
    </class> 
</hibernate-mapping> 

映射文件

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
<hibernate-mapping default-access="field" package="com.catapult.bid.model"> 
    <class name="Profiles" schema="bidtool" table="bid_tool_profiles"> 
    <id column="profile_id" name="profileId" type="string"> 
     <generator class="com.catapult.bid.commons.ProfileIDGenerator"/> 
    </id> 
    <many-to-one class="User" fetch="select" name="appUsers"> 
     <column name="user_id"/> 
    </many-to-one> 
    <property name="profileContent" type="string"> 
     <column name="profile_content"/> 
    </property> 
    <property name="scac" type="string"> 
     <column length="20" name="scac"/> 
    </property> 
    <property name="created" type="timestamp" update="false"> 
     <column name="insert_timestamp"/> 
    </property> 
    <property name="status" type="string"> 
     <column length="9" name="status" not-null="true"/> 
    </property> 
    <property name="editable" type="string"> 
     <column length="1" name="editable" not-null="true"/> 
    </property> 
    </class> 
</hibernate-mapping> 

回答

2

,你可以在这样的情况下,唯一要做的就是做一个内通过where子句联接:

select a from A a, B b where a.someColumn = b.someOtherColumn and ... 

正确的连接是唯一可能使用HQL中的实体之间的关联。

+1

但是,这将导致生成的SQL中的CROSS JOIN! – Tarik

0

您需要延迟获取Boiler_Plates(您的类不应在名称中包含下划线)和Contracts中的Profiles。然后使用类似:

select bp.contracts.profiles from Boiler_Plates bp where bp.boiler_plate_id=? 

你的代码使用了过多的下划线,你应该看看Java编码惯例太:http://www.oracle.com/technetwork/java/codeconv-138413.html