2

我正在尝试使用以下方法查询 grails 中的数据库:

            def per = User.get(springSecurityService.principal.id)
            def query = Post.whereAny {
                author { username == per.username }
            }.order 'dateCreated', 'desc'
            messages = query.list(max: 10)

我的用户在用户域中,在帖子域中我有:

    String message
    User author
    Date dateCreated

当我每次在控制器中用于填充数据库的方法是:

  def updateStatus() {
         def status = new Post(message: params.message)
        System.out.println("test " + params.message)
            status.author = User.get(springSecurityService.principal.id)
        status.save()
    }

我对查询 grails 中的数据库非常陌生,所以如果有人可以推荐一些阅读,这也很好。

谢谢

4

2 回答 2

2

新版本的 spring-security-core 插件为您的控制器添加了方法,因此您可以替换:

def per = User.get(springSecurityService.principal.id)
def query = Post.whereAny {
    author { username == per.username }
}.order 'dateCreated', 'desc'
messages = query.list(max: 10)

messages = Post.findAllByAuthor(principal, [sort: 'dateCreated', order 'desc', max: 10])

没有声明 springSecurityService

您可以将 updateStatus 操作替换为:

def updateStatus(){
    def status = new Post(message: params.message, author: principal)
    status.save()
}
于 2012-08-22T20:24:41.203 回答
1

空查询可以通过以下方式解决:

def updateStatus() {
     def status = new Post(message: params.message)
    System.out.println("test " + params.message)
        status.author = User.get(springSecurityService.principal.id)
    status.save(flush: true)
}

这可能会帮助您稍后找到数据,因为 save() 只是为您的休眠上下文提供了持久化数据的指令,但不会强制休眠在那个时候执行此操作。传递 flush:true 将强制数据立即持久化。此外 status.save(failOnError:true) 将显示您的域对象属性是否存在验证问题,从而阻止域实例完全保存到数据库中(通过抛出异常)。如果需要,您可以同时使用两者:

def updateStatus() {
     def status = new Post(message: params.message)
    System.out.println("test " + params.message)
        status.author = User.get(springSecurityService.principal.id)
    status.save(flush: true, failOnError: true)
}

希望有帮助。

您也可以在 grails-app/conf/Config.groovy 中全局设置 flush 和 failOnError: true :

grails.gorm.failOnError=true
grails.gorm.autoFlush=true
于 2012-08-22T20:30:33.110 回答