2011-09-15 16 views
0

誰でもGrailsの表を結合する方法を教えてください。私は構文について助けが必要です。複合外部キーの表を結合するためのGrails構文

のは、私は3つのテーブルを持っており、彼らは明示的に定義された外部キー制約を持っていないとしましょう:


    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にEMPLOYEEとチームに参加したいと思います。私は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

GORM doc section 5.4.1 and 5.4.2中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でクエリを実行したり、参加する方法はたくさんあります。 2つのテーブルのSQL結合を行う簡単な方法の1つの例を次に示します。

class Dept { 
    ... 
} 

class Team { 
    ... 
    Dept dept 
} 

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

eager fetchingはなぜですか?元の質問とはまったく関係がありません。 –

+0

eagerフェッチがなければ、SQL結合は行いません。たぶん私は質問の焦点として参加することを誤解していました。 – ataylor

+0

しかし、eager fetchingの使用はjoin後に行われます。 – Mike

関連する問題