2012-05-25 65 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