2014-10-14 5 views
0

Я пытаюсь обновить один столбец в таблице на основе нескольких столбцов (в разделе where) с использованием домена grails.Обновить таблицу на основе нескольких столбцов с использованием графского домена

Мой класс домен следующим образом:

класс Objectattributestrans { Строка идентификатор Строка значение атрибута // 50 // Строка ТрансИд // 50 INT attribid

static mapping = { 
      id column: 'trans_id' //['transid', 'attribid'] 
      table name: 'object_attributes_trans' 
      attrvalue column: 'value' 
      attribid column:'oa_attrib_id' 
      version false 
      } 

    static constraints = { 
      attribid blank:false, nullable:false 
      id blank:false, nullable:false 
      attrvalue maxSize: 50, nullable:true 
    } 

}

и я использую этот домен следующим образом для обновления:

Objectattributestrans.findAllByIdAndAttribid(transacId, queryKey).each { 

     it.attrvalue = updateVal.toString() 
     it.save(flush:true) ; // this will perform "update" 

} 

Но, независимо от того, строится запрос, приведено ниже.

update object_attributes_trans set oa_attrib_id=?, value=? where trans_id=?

Но я хочу, чтобы оператор обновления как

update object_attributes_trans set value=? where trans_id=? and oa_attrib_id=?

Как я могу это сделать с помощью выше области?

Спасибо.

ответ

0

Ваш образец кода немного неясен. Я не могу сказать, есть ли у вас составной первичный ключ.

В этом случае при использовании динамического искателя (findAllBy...), как у вас в вашем примере, GORM/Hibernate будет извлекать коллекцию всех соответствующих объектов. Если вы затем пропустите их, обновив каждый и вызывая save(), GORM/Hibernate выдаст оператор UPDATE для каждого объекта. Операторы UPDATE будут ссылаться только на первичные ключи/идентификационные поля, а не на исходные критерии.

Было бы более эффективным (и ближе к тому, что вы после?) Использовать запрос where вместе с updateAll или аналогичный оператор HQL.

1) Использование where запрос

def query = Objectattributestrans.where { 
    transid == myTransid && attribid == myAttribid 
} 
int total = query.updateAll(attrvalue: updateVal) 

2) Метод Hibernate HQL (отметить, что это не будет работать с не-RDBMS хранилищ данных, для которых поддержка HQL не существует)

Objectattributestrans.executeUpdate(
    "update Objectattributestrans o set o.attrvalue = :newAttrvalue " + 
    "where o.transid = :transid and o.attribid = :attribid", 
    [newAttrvalue: updateVal, transid: myTransid, attribid: myAttribid]) 
+0

Спасибо Andrew a ton ... :-) –