3 Execute search - leandrogehlen/grails-search-fields GitHub Wiki

The usage examples will use the models defined in Search rules

Simple

This is a simple example of how to execute a search

def list(Integer max) {    
    params.max = Math.min(max ?: 10, 100)    
    params.sort = 'name'
    params.order = 'asc'
    params.field = 'lastName'
    params.value = 'test'

    def search = Author.createSearch()                           
    search.setSort(params.sort, params.order == 'asc')            
    search = search.execute(params.field, params.value)     

    //generate: select count(author) from Author author where (lower(author.lastName) like 'test%)
    def count = Author.executeQuery(search.count) 

    //generate: from Author author where(lower(author.lastName) like 'test%') order by author.name asc
    def list = Author.findAll(search.query, [max: params.max, offset: params.offset])

    [authorInstanceList: list, authorInstanceTotal: count]
}

Join

When search definitions contain a field referenced another model (belongsTo), will automatically generate the HQL join with the referenced model. For exeample

    def search = Book.createSearch()																		    
    //generate: select count(book) from Book book join book.author author 
    def count = Author.executeQuery(search.count) 
    //generate: from Book book join fetch book.author author
    def list = Author.findAll(search.query)		
    
    //Add where 
    search = search.execute("title" , "test")
    //generate: select count(book) from Book book join book.author author where(lower(book.title) like 'test%')
    def count = Author.executeQuery(search.count) 
    //generate: from Book book join fetch book.author author where(lower(book.title) like 'test%')
    def list = Author.findAll(search.query)

Sorting

Below is shown the possibilities for ordering.

    def search = Book.createSearch()																		    
    search.order = "author_name, title asc, ISBN desc"	
    //generate: select count(book) from Book book join book.author author
    def count = Author.executeQuery(search.count) 
    //generate: from Book book join fetch book.author author order by book.title asc, book.ISBN desc
    def list = Author.findAll(search.query)	
    
    search.setSort("releaseDate", false)
    //generate: from Book book join fetch book.author author order by book.releaseDate desc
    def list = Author.findAll(search.query)
		
    search.setSort("author_name", true)
    //generate: from Book book join fetch book.author author order by author.name asc
    def list = Author.findAll(search.query)