2010-06-30 16 views
1

Comment utiliser "SELECT id, nom, pièce, description FROM user" dans grails findAll tag.grails findAll tag

J'ai essayé

User.findAll("SELECT id, name, part, description FROM user") 

au lieu d'utiliser

User.findAll("FROM user") 

Mais montre des erreurs. quelqu'un peut-il me suggérer l'étiquette

merci, .. Sri

Répondre

3

finadAll() renvoie une collection d'objets de domaine, afin de sélectionner des colonnes énumérant n'a pas de sens; les requêtes qu'il comprend ne sont pas du vrai SQL, et consistent essentiellement en des clauses WHERE. Puisque vous ne semblez pas vouloir limiter le jeu de résultats, ce qui est probablement tout ce que vous avez besoin:

User.findAll() 

Il retournera une collection de tous les objets User. Si vous avez besoin de contraintes, la syntaxe ist

User.findAll("from User as u where u.id=?", [userId]) 

Ou, encore plus simple, vous pouvez utiliser a dynamic finder:

User.findAllById(userId); 
+0

mais avons-nous une étiquette qui montre "SELECT id, nom, partie, description FROM user". merci – Srinath

+0

@Srinath: non, il n'y a rien comme ça. Cela n'aurait aucun sens pour un framework qui fonctionne avec des objets de domaine. Quel est le problème avec l'utilisation des méthodes que j'ai énumérées pour obtenir des objets Utilisateur et ensuite accéder aux propriétés de ces objets? On dirait que vous n'avez travaillé qu'avec PHP auparavant et que vous essayez maintenant d'écrire du code PHP dans Grails. Cela ne vous mènera pas loin. –

+0

Auparavant, j'ai travaillé dans Ruby on Rails. J'ai déjà utilisé le tag findAll que vous avez mentionné ci-dessus. Je veux juste savoir s'il y a des tags comme ça dans Grails aussi. merci pour vos suggestions :( – Srinath

1

Si vous voulez exécuter des requêtes de type rapport comme celui-ci, utilisez la méthode executeQuery:

def rows = User.executeQuery("SELECT id, name, part, description FROM User") 

la valeur de retour sera une liste d'objets [] où chaque élément du tableau d'objet est le type de la colonne, à savoir le 1er élément sera une longue, 2 une chaîne, etc.

Notez que l'utilisateur doit être en majuscules car vous faites référence à l'entité Hibernate - ce n'est pas une requête SQL, c'est HQL.

0

Si vous souhaitez interroger uniquement certains champs, vous pouvez utiliser une requête de critère avec une projection.

Exemple:

def userProperties = User.withCriteria { 
    projections { 
     property('id') 
     property('name') 
     property('part') 
     property('description') 
    } 
} 

Cette requête retourne un tableau de chaînes (ou quel que soit le type de colonne de base de données est mis en correspondance) pour chaque ligne correspondante, au lieu d'un objet de domaine.

0

Il retournera une ArrayList d'objets que vous avez seulement besoin d'accéder à ces valeurs d'objets. Par exemple:

def result = Code.findAll("from Code as c where c.user_code=?",[pass]) 
result[0].user_code 

Si ma classe de code est quelque chose comme ceci:

class Code { 

    String user_code 
    boolean flg_active 

    static constraints = { 

     user_code nullable:true, blank:true, size:0..Text.MID 
     flg_active nullable:true, blank:true, default:1 
    } 
} 

espérons qu'il vous aidera!