フィールド値を一括で設定
コード内で可能なかぎり、最適なパフォーマンスを得るには、setAttributeValuesFromMap()関数の1回のコールで行のすべてのフィールドの値を設定します。
これらのバルク割当関数を使用すると、処理時間が節約され、同等のジョブが一度に1つのフィールドで実行された場合と比較して、動的選択リストおよび固定選択リスト属性検証に関連する回避可能な問合せを排除できます。
たとえば、次のコード例では、既存のスタッフ行の5つのフィールドの値を設定します。 コードでは、「ビジネス・ロジック問合せの簡略化」で説明されている
queryRow()
ヘルパー関数を使用して従業員IDによる行を検索しています // Find an existing staff member by the indexed primary key field EmployeeId
// Then bulk-assign 5 field values whose names are also included in the
// view object's select list to avoid unnecessary "fault-in" queries.
def emp = adf.util.queryRow(
select:'EmployeeId,Email,CarMake,CarModel,Vacation,AccrualDate',
from: 'StaffMember',
where: 'EmployeeId = :id',
binds: [id: 123456789])
if (emp) {
emp.setAttributeValuesFromMap(
Email: emp.Email.replace('old.org','new.org'),
CarMake: 'VW',
CarModel: 'GLF',
Vacation: 160,
AccrualDate: today())
}
新しい行を作成する場合は、createAndInitRowFromMap()
関数を使用して同じ一括割当てタスクを実行できます。 次の例では、すべてのフィールドを一括して割り当てる新しいスタッフを作成します: def emps = newView('StaffMember')
// Insert a new staff member, setting all necessary fields in bulk
emps.insertRow(emps.createAndInitRowFromMap(
Email: 'jane.barnes@example.org',
CarMake: 'AUD',
CarModel: 'A8',
Vacation: 200,
AccrualDate: today()))
この項のどちらの例も、先頭のMap
引数を持つ関数にインラインで渡されたリテラルMap
の前後の大カッコを削除するためのGroovyのサポートを示しています。 独自の機能がこの機能を活用する方法の詳細は、「オプションの指定メソッド引数の使用」を参照してください。
汎用ヘルパー・コードを記述する際に、割り当てるフィールド「名前」と、別のリストに割り当てる対応する「値」を処理する方が便利な場合は、
setAttributeValues()
関数の使用を検討してください。 次の例では、setAttributeValuesFromMap()
よりも状況に適切に対応する方法を示しています。 この代替機能は、同じパフォーマンスの向上を実現します。 // void doBulkAssignment(Object row, List fieldNames, List fieldValues)
// accepting row to assign, field names and field values as separate Lists
if (fieldNames.size() == fieldValues.size()) {
row.setAttributeValues(fieldNames, fieldValues)
}
else {
adf.util.error("Must supply same number of fields and values to assign!")
}