nikolaj
nikolaj

Reputation: 340

Grails findBy multiple columns Ilike

I have a simple Tag class with only two fields, name and value,

class Tag {
    String name
    String value
}

and I'm trying to render an XML where I want to search for parts of both parameters via findBy...Ilike().

def getXml = {
    render Tag.findAllByNameAndValueIlike("%${params.name}%", "%${params.value}%") as XML
}

But this doesn't give my any results. If I use only one parameter, it works as I expect:

def getXml = {
    render Tag.findAllByNameIlike("%${params.name}%") as XML
}

My next question is probably going to be about filtering the results, and adding other "similar" tags to the returns list, so is there a way to solve the above with something like:

def getXml = {
    list = Tag.findAllByNameIlike("%${params.name}%")
    list.add(Some other stuff)
    list.sortBy(Some thing, maby name length)
}

Upvotes: 0

Views: 7330

Answers (3)

nikolaj
nikolaj

Reputation: 340

Both answer are good. I tried both, but I have to say I like the withcCritia the best. It seems very flexibly.

    def result = Tag.withCriteria {
        if(params.name != null)
            ilike('name', "%${params.name}%")
        if(params.value != null)
            ilike('value', "%${params.value}%")
    }
    result.add(new Tag('name': "something"))
    render result as XML

Upvotes: 1

James Kleeh
James Kleeh

Reputation: 12238

You have to put the restrictions(InList, NotNull, etc) on each field of a dynamic finder. If you do not, it assumes equals. Here is what you were looking for:

Tag.findAllByNameIlikeAndValueIlike("%${params.name}%", "%${params.value}%")

Upvotes: 1

Rob Hruska
Rob Hruska

Reputation: 120446

For your multiple-field ilike query you can use withCriteria:

def result = Tag.withCriteria {
    ilike('name', "%${params.name}%")
    ilike('value', "%${params.value}%")
}

This will return a list of Tag domains whose name matches the provided name and value matches the provided value.

The Criteria DSL will probably let you do most of the filtering you need, but you can also consider using some of the Groovy collection examples here.

Upvotes: 2

Related Questions