Piyush Chaudhari
Piyush Chaudhari

Reputation: 1012

Grails GORM find by value inside map of Domain

I am using Grails 2.2.4 and having one Domain contains value as map and I want to find domain object using key of map. Please help me to resolve this issue.

Student.groovy
package com.grails

import java.util.Map;

class Student {
    String firstName
    String lastName
    Map address
    static constraints = {
    }
}

When My application are run I can see that Grails application create tables in database are as follow:

1) first table 
 student
    id
    version
    first_name
    last_name
    indexes

2) second table
 student_address
    address
    addres_idx
    addres_elt

When I save Domain as:

def std = new Student()
std.firstName = 'Piyush'
std.lastName = 'Chaudhari'
std.address = [city:'Surat',state:'Gujarat',pincode:'38001']
std.save(flash:true)

values are insert in database as follow:

student table
ID  VERSION     FIRST_NAME      LAST_NAME  
1     0         Piyush          Chaudhari

student_address table

ADDRESS     ADDRESS_IDX     ADDRESS_ELT  
1            city             Surat
1            state            Gujarat
1            pincode          38001

Now, I want data or row using GORM like Student.findBy_____ or Student.findAllBy______ where 'city' = surat

Any one can help me to resolved this issue?

Upvotes: 1

Views: 2472

Answers (3)

roeygol
roeygol

Reputation: 5048

You can use:

Student.findBy<FieldName1>And<FieldName2> (<FieldNameParameter1>, <FieldNameParameter2>)

Or Either:`

Student.list().find { it.address.city == 'Surat' }
Student.list().findAll { it.address.city == 'Surat' }

`

Upvotes: 1

agusluc
agusluc

Reputation: 1475

Define an address class, and then add an address field to the student class (this will change how your tables are mapped in the database):

class Student {
    String firstName
    String lastName
    Address address
    static constraints = {
    }
}

class Address {
    String city
    String state
    String pincode
}

Address should be another entity in your domain, not a map of values. Remember that Grails GROM is an ORM, so you should design your domain using a OOP model in order to take advantage of the dynamic finders and criterias for doing queries.

With those changes in place, you can now use a simple criteria:

def students = Student.withCriteria{
  'address'{
    eq('city', 'surat')
  }
}

More information about criterias in the grails docs: http://grails.org/doc/latest/ref/Domain%20Classes/withCriteria.html http://grails.org/doc/latest/guide/single.html#criteria

If you want to use Dynamic finders, you will have to get all the address with city = 'surat' and then use a findByAddressInList(...). But i think that in this case, criterias is a better approach

Upvotes: 0

leomeurer
leomeurer

Reputation: 752

I don't think that you can search things like this using maps.

Maybe you can do this:

def students = Student.list()
def result = students.each { student -> student.address.city == 'Surat' }
println("Resultado" + result)

But this is a very bad way to do this kind of things

Upvotes: 0

Related Questions