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)
}

それが役立つことを願っています。

flash と failOnError: true をgrails-app/conf/Config.groovyでグローバルに設定できます:

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