Grails Controller "show" 操作导致 2 select 具有 "unique" 约束的查询
Grails Controller "show" action causing 2 select queries with a "unique" constraint
在使用 H2 和 PostgreSQL 进行开发的 grails 2.4.4 上,当在域对象上调用脚手架控制器的 "show" 操作时,我看到了这种奇怪的行为,它有一个 "unique" 对其 "name" 属性 的约束:执行了 2 SQL select 查询。
第一个查询通过对象的 ID 加载对象,后续查询通过其 "name".
加载对象
虽然这在保存对象时有意义(在保存之前检查唯一性,如 this question 中所讨论),但我认为在 "show" 操作的情况下这两个查询没有任何意义.当去除唯一约束时,只执行一个查询。这是预期的行为,还是我做错了什么?
示例对象:
class Book {
String name
String author
static constraints = {
name(nullable: false, blank: false, unique: true)
}
}
控制器是脚手架,所以一般来说,show 动作是这样的:
def show(Book bookInstance) {
respond bookInstance
}
记录的 2 个 SQL 查询(缩短)如下所示:
select ... from book book0_ where book0_.id=?
select ... from book this_ where this_.name=?
show动作的bookInstance
参数在这里被当成Command object,意思是在传递给动作之前正在验证.因此检查域 class 约束并由第二个查询验证 name
字段声明的唯一性。
检查在这里真的没用,但该机制旨在将请求参数(id
除外)绑定到域 class 属性,其中验证有意义。
要防止验证,请像这样实例化 Book 对象:
def show() {
Book bookInstance = Book.get(params.id)
respond bookInstance
}
在使用 H2 和 PostgreSQL 进行开发的 grails 2.4.4 上,当在域对象上调用脚手架控制器的 "show" 操作时,我看到了这种奇怪的行为,它有一个 "unique" 对其 "name" 属性 的约束:执行了 2 SQL select 查询。
第一个查询通过对象的 ID 加载对象,后续查询通过其 "name".
加载对象虽然这在保存对象时有意义(在保存之前检查唯一性,如 this question 中所讨论),但我认为在 "show" 操作的情况下这两个查询没有任何意义.当去除唯一约束时,只执行一个查询。这是预期的行为,还是我做错了什么?
示例对象:
class Book {
String name
String author
static constraints = {
name(nullable: false, blank: false, unique: true)
}
}
控制器是脚手架,所以一般来说,show 动作是这样的:
def show(Book bookInstance) {
respond bookInstance
}
记录的 2 个 SQL 查询(缩短)如下所示:
select ... from book book0_ where book0_.id=?
select ... from book this_ where this_.name=?
show动作的bookInstance
参数在这里被当成Command object,意思是在传递给动作之前正在验证.因此检查域 class 约束并由第二个查询验证 name
字段声明的唯一性。
检查在这里真的没用,但该机制旨在将请求参数(id
除外)绑定到域 class 属性,其中验证有意义。
要防止验证,请像这样实例化 Book 对象:
def show() {
Book bookInstance = Book.get(params.id)
respond bookInstance
}