我正在尝试使用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=?
如何使用上述域名进行此操作?
感谢。
答案 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])