一部の値がnullになる可能性があるため、一意キーのみを持つテーブル(Oracle Formsの時代からのレガシー)をマップしようとしています。ユーザーは、他のアプリケーションのデータがcharまたはnumberのどちらで存在し、テーブルに2つのフィールド(1つはvarchar2、もう1つはnumber)があるかどうかを選択できます。
これにドメインクラスを使用することは可能ですか?
例
Mytable
---------------------------------------------------------------
office_schedule_id NUMBER(5) NOT NULL
office_company_char VARCHAR2(6)
office_schedule_char VARCHAR2(10)
office_company_num NUMBER(6)
office_schedule_num NUMBER(5)
default VARCHAR2(1)
一意の制約は、「デフォルト」を除くすべてのフィールドで構成されます。
私はこれを試しました:
class OfficeSchedule {
int officeScheduleId
String officeScheduleName
static mapping = {
version false
table 'office_schedules'
id column: 'office_schedule_id', name: 'officeScheduleId'
}
static hasMany = [ schedules : IntegrationSchedules ]
}
//this represents MyTable
class IntegrationSchedules {
String officeCompanyChar
String officeScheduleChar
Integer officeCompanyNum
Integer officeScheduleNum
String default
static belongsTo = [ officeSchedule : OfficeSchedule ]
int hashCode() {
def builder = new HashCodeBuilder()
//added all fields of the unique key
builder.toHashCode()
}
static mapping = {
version false
table 'mytable'
id composite: ['officeSchedule','officeCompanyChar','officeScheduleChar','officeCompanyNum','officeScheduleNum']
officeSchedule(column:'office_schedule_id')
}
}
クエリを実行しようとすると、56レコードのうち5つだけが返されます
println IntegrationSchedules.findAll().size() //prints 5 but table have 56
OfficeScheduleとの関係を削除しようとしましたが、それでも5行しか返されません。
そのとき、返される行はすべてのフィールドに通知されているためであることに気付きました。これは、キーをPKであるかのように定義しているため意味があります。
テーブルを使用するレガシーアプリケーションであるため、テーブルを変更できません。
回避策の1つは、これをGroovy Beanとして変換し、サービスを使用してオブジェクトを作成することですが、これでは、条件とGORMfindByメソッドを使用できません。