我正在尝试使用以下方法查询grails中的数据库:
def per = User.get(springSecurityService.principal.id)
def query = Post.whereAny {
author { username == per.username }
}.order 'dateCreated', 'desc'
messages = query.list(max: 10)
我的用户位于用户域中,并且位于Post域中:
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中查询数据库,所以如果有人可以推荐一些阅读,这也会很好。
由于
答案 0 :(得分: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()
}
答案 1 :(得分: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()只是为您的hibernate上下文提供了持久保存数据的指令,但此时并不强制hibernate执行此操作。传递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