使用grails域基于多列更新表

时间:2014-10-14 04:47:27

标签: grails

我正在尝试使用grails域基于多个列(在where子句中)更新表中的一列。

我的域名类如下:

class Objectattributestrans {     字符串ID        字符串attrvalue // 50   // String transid // 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=?

如何使用上述域名进行此操作?

感谢。

1 个答案:

答案 0 :(得分:0)

您的代码示例有点不清楚。我无法确定你是否有复合主键。

除此之外,当您在示例中使用动态查找器(findAllBy...)时,GORM / Hibernate将检索所有匹配对象的集合。如果然后循环遍历它们,更新每个并调用save(),GORM / Hibernate将为每个对象发出UPDATE语句。 UPDATE语句将仅引用主键/ id字段而不是原始条件。

使用where查询以及updateAll或类似的HQL语句会更有效(并且更接近你所追求的?)。

1)使用where查询

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

2)Hibernate HQL方法(请注意,这不适用于不存在HQL支持的非RDBMS数据存储

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