2012-08-22 3 views
2

Je suis en train d'interroger une base de données Grails en utilisant:Grails interroge la base

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

Mon utilisateur est dans un domaine utilisateur et dans le domaine post je:

String message 
    User author 
    Date dateCreated 

quand je lance cette requête est vide chaque fois que ma méthode dans le contrôleur pour remplir la base de données est:

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

Je suis très nouveau à qu bases de données dans les grails, donc si quelqu'un peut vous recommander de lire ce serait bien aussi.

Merci

Répondre

2

Nouvelle version du plug-in printemps-sécurité-core ajouter des méthodes pour vous contrôleur, vous pouvez ainsi remplacer:

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

avec

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

Sans déclarer springSecurityService

Vous pouvez remplacer l'action updateStatus par:

def updateStatus(){ 
    def status = new Post(message: params.message, author: principal) 
    status.save() 
} 
1

requête vide peut être résolu avec:

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

Cela peut vous aider à trouver les données plus tard que la sauvegarde() donne juste votre contexte de mise en veille prolongée l'instruction pour conserver les données, mais ne force pas hiberner pour le faire à ce moment-là. passing flush: true forcera les données à persister immédiatement. En outre, status.save (failOnError: true) révélera si les propriétés de votre objet de domaine ont des problèmes de validation empêchant l'enregistrement de l'instance de domaine dans la base de données (en lançant une exception). Vous pouvez utiliser les deux si vous le souhaitez:

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

espérons que cela aide.

Vous pouvez définir et affleurant failonerror: true globalement aussi bien dans Grails-app/conf/Config.groovy:

grails.gorm.failOnError=true 
grails.gorm.autoFlush=true 
Questions connexes