See the light - agile, industrial strength, rapid web application development made easy

(Quick Reference) # namedQueries ## Purpose The `namedQueries` static property defines named queries. Named queries support the criteria builder syntax. See the section on the Criteria Builder in the user guide for more information. ## Examples

    class Publication {   String title
       String author
       Date datePublished
       Integer numberOfPages   static namedQueries = {
           recentPublications {
               def now = new Date()
               gt 'datePublished', now - 365
           }       oldPublicationsLargerThan { pageCount ->
               def now = new Date()
               lt 'datePublished', now - 365
               gt 'numberOfPages', pageCount
           }       publicationsWithBookInTitle {
               like 'title', '%Book%'
           }       recentPublicationsWithBookInTitle {
               // calls to other named queries…
               recentPublications()
               publicationsWithBookInTitle()
          }
       }
    }

    // get all recent publications…
    def recentPubs = Publication.recentPublications.list()// get up to 10 recent publications, skip the first 5…
    def recentPubs = Publication.recentPublications.list(max: 10, offset: 5)// get a single recent publication
    def recentPub = Publication.recentPublications.get()// get the number of recent publications…
    def numberOfRecentPubs = Publication.recentPublications.count()// get a recent publication with a specific id…
    def pub = Publication.recentPublications.get(42)// get all recent publications where title = 'Some Title'
    def pubs = Publication.recentPublications.findAllWhere(title: 'Some Title')// get a recent publication where title = 'Some Title'
    def pub = Publication.recentPublications.findWhere(title: 'Some Title')// dynamic finders are supported
    def pubs = Publication.recentPublications.findAllByTitle('Some Title')// get all old publications with more than 350 pages
    def pubs = Publication.oldPublicationsLargerThan(350).list()// get all old publications with more than 350 pages
    // and the word 'Grails' in the title
    def pubs = Publication.oldPublicationsLargerThan(350).findAllByTitleLike('%Grails%')// get all recent publications with 'Book' in their title
    def pubs = Publication.recentPublicationsWithBookInTitle().list()
The `list` method on named queries supports the same attributes as the static `list` method added to domain classes (sort, order, ignoreCase, fetch etc...). See the list docs for details. Note that calling something like `Publication.recentPublications.get(42)` is not the same as calling something like `Publication.get(42)`. The former will only return a `Publication` if the `Publication` with id 42 meets all the criteria defined in the `recentPublications` named query. Named criteria support `listDistinct()`:

    class PlantCategory {    Set plants
        String name    static hasMany = [plants: Plant]    static namedQueries = {
            withPlantsInPatch {
                plants {
                    eq 'goesInPatch', true
                }
            }
        }
    }
    class Plant {
        boolean goesInPatch
        String name
    }
    PlantCategory.withPlantsInPatch.listDistinct()
Named criteria support additional criteria being supplied at invocation time in the form of a criteria closure:

    // get all recent publications with author names beginning with Tony or Phil…
    def books = Publication.recentPublications {
        or {
            like 'author', 'Tony%'
            like 'author', 'Phil%'
        }
    }// get the number of recent publications with
    // author names beginning with Tony or Phil…
    def numberOfBooks = Publication.recentPublications.count {
        or {
            like 'author', 'Tony%'
            like 'author', 'Phil%'
        }
    }
Named criteria may be chained together. When criteria are chained together, the query will be generated as if all of the chained criteria had been combined in a single criteria closure.

    // recent publications with 'Book' in the title
    def books = Publication.recentPublications.publicationsWithBookInTitle.list()// old publications with more than 500 pages and with 'Book' in the title
    def books = Publication.oldPublicationsLargerThan(500)
                           .publicationsWithBookInTitle
                           .list()
When a named query involves a domain class relationship and the relationship class defines a named query, that named query may be accessed directly as a method call. An example:

    class Author {    static hasMany = [publications: Publication]    static namedQueries = {
             authorsWithRecentPublications {
                 publications {
                     // invoking a named query defined in the Publication class…
                     recentPublications()
                 }
             }
        }
    }

    class Publication {    Author author    static namedQueries = {
            recentPublications {
                def now = new Date()
                gt 'datePublished', now - 10
            }
        }
    }
| Quick Reference (hide)