2011-09-15 27 views
0

任何人都可以請告訴我如何在Grails中連接表?我需要語法幫助。在複合外鍵上連接表的Grails語法

比方說,我有三個表和他們沒有任何明確定義外鍵約束:


    EMPLOYEE: 
    empid 
    name 
    emp_deptid 
    emp_teamid 
    title 
    salary 
    hiredate 

    DEPT: 
    dept_deptid 
    deptname 
    location 
    size 
    numOfTeams 

    TEAM: 
    team_teamid 
    teamname 
    team_deptid 
    responsibility 
    size 

我想加盟員工和團隊TEAMID和DEPTID。我知道如何在SQL查詢中連接表。我實際上想知道如何在Grails中執行表連接(在使用OnetoOne,OnetoMany,hasMapped等的這些選定列上)。感謝

編輯:

Class Emp(){ 

String empid 
String teamid 
String deptid 
..... 
..... 
Date hiredate 

Team team 

static mapping = { 
    .... 
      .... 
    deptid column:'emp_deptid' 
    teamid column:'emp_teamid' 
    ..... 
      ..... 
    team column: ['teamid', 'deptid'] 
} 


} 


Class Team(){ 
... 
... 
String teamid 
String deptid 

static mapping ={ 
... 
deptid column:'team_deptid' 
teamid column:'team_teamid' 
.... 
} 
} 
+0

您的Grails域模型是什麼樣的? –

+0

我編輯了我的原始文章以包含域類。 – Mike

回答

2

有2小節中GORM doc section 5.4.1 and 5.4.2,並重命名爲 「查詢關聯」。

編輯:

突然,它不是那麼容易 - 爲精神不集中抱歉。

Grails正式支持syntax for only compound primary keys,不屬於國外。我在Grails中發現了一堆關於複合外鍵的問題:GRAILS-4606GRAILS-4256

我可以提出可行的方法,但我沒有自己測試。

A「列清單」語法(從GRAILS-4256採取樣品):

class Employee { 
    Team team 
    static mapping = { 
    // ... column mapping 
    team column: [team_id, dept_id] 
    } 
} 

勞羅·貝克爾使用custom configuration class,增加了複合外鍵映射語法 - 這似乎已經爲他工作。

有些人甚至用單個鍵字段創建可更新的數據庫視圖,並將域映射到他們而不是原始表 - 但我相信這是一個矯枉過正的問題。

+0

該文檔沒有解釋如何在選定的列上連接表。它看起來就是那些已經有外鍵關係的表。 – Mike

+0

對不起,我是不留神。是的,你必須在這些表格之間建立關係 - 至少在映射中。自定義外鍵映射在「5.5.2.1表和列名稱」一節中介紹。讓我更新答案。 –

+0

感謝您的信息。我編輯了我的原始帖子以添加映射DSL。在使用Dept和Team域的Web服務上進行GET時,出現「ERROR util.JDBCExceptionReporter - ORA-00972:標識符太長」的錯誤。看起來像我的映射DSL是不正確的。任何想法我做錯了什麼? – Mike

0

有很多方法可以查詢和加入grails。下面是一個簡單方法來實現兩個表的SQL連接的一個示例:

class Dept { 
    ... 
} 

class Team { 
    ... 
    Dept dept 
} 

Team.list(fetch: [dept: 'eager']) 
+0

爲什麼預先抓取?與原始問題沒有任何關係。 –

+0

沒有預先抓取,它不會執行SQL連接。也許我誤解了加入是問題的焦點。 – ataylor

+0

但是,在加入之後使用提前獲取,對吧? – Mike