1

従業員給与の 2 つのテーブルが 1:N の関係にあるとします (1 つの給与を多くの従業員に関連付けることができます)。

プレーン SQL では、テーブルは次のように結合されます。

SELECT e.id, e.name, s.salary FROM employee e, salary s WHERE s.id = e.salary_id AND e.id = 12345;

次の GORM を利用したドメイン クラスを仮定すると、従来のデータベース構造をクラスにどのようにマッピングすればよいでしょうか?

class Employee {
   String name
   int salary
}

明確化 #1:両方のテーブルからのデータを含む 1 つのドメイン クラスのみが必要です。したがって、別のクラスを追加することはオプションではありません。

明確化 #2:私が答えを見つけようとしている質問は、単に「Grails/GORM を使用して 2 つのテーブルを 1 つのクラスにマップするにはどうすればよいか」ということです。それが不可能であると思われる場合は、質問を再度述べるのではなく、回答で明確に述べてください。

4

4 に答える 4

2

IMO プレーンな Grails/GORM では、複数のテーブルを結合してそれらを 1 つのドメイン クラスにマップすることはできません。回避策として、従来の XML 休止状態マッピングを使用し、結合機能を利用して目的の目標を達成することができます。もちろん、GORM グッズの多くを失うことになります。

于 2009-03-16T10:31:29.400 に答える
0

SQL の例は、Employee と Salary の 2 つのテーブルがあることを示しています。これは、クラスにも反映される必要があります。したがって、1 つではなく 2 つのクラスが必要です。GORM マッピングは次のようになります。

class Employee {
   String name
   Salary salary
}

class Salary {
   static hasMany = [ employees : Employee ]
   int salary
}

http://www.grails.org/GORM+-+Defining+relationshipsを参照してください

于 2009-03-12T18:51:37.693 に答える
0

給与と名前をプロパティとして持つ代わりに、これら両方のテーブルに対して実際にクエリを実行する get* メソッドとして持つことができます。

確かに、それは grails の方法ではありません。grails の方法に従うことを強くお勧めします。

于 2009-03-14T04:23:12.210 に答える
-1

データベースに2つのテーブルがある場合に別のクラスを追加できないという制限を完全には理解していませんが、統一されたインターフェースを探している場合、メソッドをSalaryクラスに委譲することはできますか?

何かのようなもの:

class Salary {
    int amount
}

class Employee {
    Salary _salary
    String name

    String toString() { name }

    public Integer getSalary() {
        return _salary?.amount
    }
    public void setSalary(Integer amount) {
    // not quite sure of your business logic here, this is a guess
        _salary = Salary.findByAmount(amount)
        if (!_salary) {
            _salary = new Salary(amount: amount)
            _salary.save()
        }
    }
}


def e = new Employee(name:"willy loman", salary: 100)
e.save()
assert e.salary == 100

また、カスタムの休止状態マッピング ファイルを使用して、求めているものを機能させることができる可能性もありますが、そのような方法で休止状態をゆがめることについては、確かなことを言うのに十分ではありません。

このページのカスタム ユーザー タイプのセクションを参照してください。

于 2009-03-14T03:37:20.917 に答える