我将find用于:

 find("from domain d where d.id=? AND d.name=?",[params.id, params.name])

给我第一个匹配结果。
现在我看到有findWhere():
  Book.findWhere(author: params.author, title: params.title)

还返回第一个匹配结果集。
基本区别是什么,什么时候使用。

先感谢您。

最佳答案

对,所以我创建了一个测试应用程序,创建了一个测试Domain类:

package test

class Book {
    String title
    String author

    static constraints = {
    }
}

在Bootstrap中添加了一些虚拟数据:
import test.*

class BootStrap {

    def init = { servletContext ->
        new Book( title:'Book 1', author:'Tim' ).save()
        new Book( title:'Book 2', author:'Alice' ).save()
        new Book( title:'Book 3', author:'Bob' ).save()
    }
    def destroy = {
    }
}

和一个测试 Controller :
package test

import grails.converters.JSON

class BookController {
    def test1() {
        Book b = Book.find( "from Book as b where b.author = ? and b.title = ?", [ 'Tim', 'Book 1' ] )
        render b as JSON
    }
    def test2() {
        Book b = Book.findWhere( author:'Tim', title:'Book 1' )
        render b as JSON
    }
    def test3() {
        Book b = Book.findByAuthorAndTitle( 'Tim', 'Book 1' )
        render b as JSON
    }
}

然后,通过添加打开休眠日志记录
trace 'org.hibernate.type'
debug 'org.hibernate.SQL'

到Config的log4j部分,然后:
logSql = true

到DataSource.groovy的dataSource部分。

然后,运行所有3种 Controller 方法。
find执行:
select book0_.id as id0_,
       book0_.version as version0_,
       book0_.author as author0_,
       book0_.title as title0_
from book book0_
where book0_.author=? and book0_.title=? limit ?
findWhere执行:
select this_.id as id0_0_,
       this_.version as version0_0_,
       this_.author as author0_0_,
       this_.title as title0_0_
from book this_
where (this_.author=? and this_.title=?) limit ?
findByAuthorAndTitle给我们:
select this_.id as id0_0_,
       this_.version as version0_0_,
       this_.author as author0_0_,
       this_.title as title0_0_
from book this_
where this_.author=? and this_.title=? limit ?

如您所见,在这个简单的例子中,它们只是说同一件事的三种方式

08-28 15:23