5

am:n リレーションとリレーション用のいくつかの追加属性を持つレガシー データベースが与えられた場合、これを squeryl でどのように定義できますか。最後に、テーブルは次のようになります。

   +--------------+ +---------------+ +---------------- +
   | | 表 A | | | Rel_A_B | | | 表 B |
   +-------------+ ____ +---------------+ ____ +-------------- --+
   | | id:整数 | | | テーブル A: 整数 | | | compkey_1: 整数 |
   | | (より多くの属性) | | | tableB_1: 整数 | | | compkey_2: 整数 |
   +--------------------+ | tableB_2: 整数 | | | (より多くの属性) |
                         | | 値: Varchar| +----------------+
                         | | 日付: 日付 |
                         +--------------+

3 つのテーブルを squeryl で手動で定義しても問題ありません。ただし、現時点(0.9.4)のドキュメントを理解している限り、関係に追加の属性を使用して多対多の関係を定義する可能性はありません。

そのため、3 つのテーブルと 2 つの一対多リレーションを定義しました。


// TableA
class TableA(val id: Int, ...) extends KeyedEntity[Int] {
    def this() = this(0, ...)
}

// TableB
class TableB(val compkey1: Int, val compkey2: Int, ...) 
        extends KeyedEntity[CompositeKey2[Int, Int]] {

    def id = CompositeKey2(compkey1, compkey2)
}

// Rel_A_B
class RelAB(val tabA: Int, val tabB1: Int, val tabB2: Int, val value: String, 
            val date: Date) extends KeyedEntity[CompositeKey3[Int, Int, Int]] {

    def id = CompositeKey3(tabA, tabB1, tabB2)
}

TableA と RelAB の間の関係を定義するのは簡単です。通常の 1 対多の関係を使用します。


val relA =
    oneToManyRelation(tableA, relAB).
    via((a, r) => a.id === r.tableA)

しかし、2 番目の関係を定義する方法がわかりません。tableB の列だけを含むリレーション テーブル (compkeyB という名前) に追加の複合値を定義し、それを tableB の複合キーと比較しようとしましたが、うまくいきません。


val relB =
    oneToManyRelation(tableB, relAB).
    via((b, r) => b.id === r.compkeyB)

「タイプの不一致」例外をスローします。

found   : org.squeryl.dsl.ast.LogicalBoolean
required: org.squeryl.dsl.ast.EqualityExpression

これを解決する方法はありますか?

4

1 に答える 1

6

あなたはこの制限に悩まされています:

http://www.assembla.com/spaces/squeryl/tickets/25-compositekeys-cannot-be-the-binding-expression-for-relations

于 2011-07-05T06:52:31.307 に答える