【问题标题】:JSON Grail Groovy Update SQLJSON Grail Groovy 更新 SQL
【发布时间】:2011-06-28 21:35:08
【问题描述】:

使用带有 grails 的 Groovy 脚本并希望更新数据库中的记录。我从 JSON 中获取对象并将其转换为 Domain 类,然后对其执行 save() 。据我了解,因为我是 Groovy 和 grails 的新手,如果“id”已经存在,则保存应该更新。但我不明白,我得到标准 SQL 错误“重复条目 '1' 键'PRIMARY'”。我该如何解决这个问题?

def input = request.JSON
def instance = new Recorders(input)
instance.id = input.getAt("id")
instance.save()

我的域名是:

class Recorders {

Integer sdMode
Integer gsmMode

static mapping = {
    id generator: "assigned"
}

static constraints = {
    sdMode nullable: true
    gsmMode nullable: true
}
}

【问题讨论】:

  • 正如 Rob Hruska 指出的那样,您必须从数据库中获取对象并对其进行更新;不创建具有重复 ID 的新的。

标签: sql grails groovy sql-update


【解决方案1】:

您可能应该get,而不是new Recorders(input)

def input = request.JSON
def instance = Recorders.get(input.getAt('id'))
instance.properties = input
instance.save()

编辑

(来自您的评论)如果它不存在并且您想插入它:

def input = request.JSON
def id = input.getAt('id')
def instance = Recorders.get(id)
if(!instance) {
    instance = new Recorders(id: id)
}
instance.properties = input
instance.save()

我很少使用分配的 id 生成器,所以我不确定 Grails 是否会自动绑定 id(因为它期望它被分配)。如果是这样,您可能可以从Recorders() 构造函数中删除id: id

【讨论】:

  • 如果它不存在那我想让它插入怎么办......我想我也应该把它放在问题中。
  • 在调用 save() 之前必须手动分配此类的 id 无效:
  • instance.properties = 输入不起作用所有字段都为空
  • 我不得不添加 instance.sdMode = input.getAt("sdMode") 和 instance.gsmMode = input.getAt("gsmMode") 很奇怪,因为我知道 instance.properties = 以前工作过。 ...
  • 很高兴你让它工作。可能有一种方法可以使绑定起作用。有一个关于 JSON 绑定的open Grails bug,但我只是略读了一下;不确定它是否适用于您的情况。
猜你喜欢
  • 2022-09-27
  • 2019-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多