Grails GORM按域内地图的值查找

时间:2014-12-12 09:59:51

标签: grails gorm grails-2.0 grails-domain-class

我正在使用Grails 2.2.4,并且有一个Domain包含值作为map,我想使用map的键找到域对象。请帮我解决这个问题。

Student.groovy
package com.grails

import java.util.Map;

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

运行我的应用程序时,我可以看到Grails应用程序在数据库中创建表格如下:

1) first table 
 student
    id
    version
    first_name
    last_name
    indexes

2) second table
 student_address
    address
    addres_idx
    addres_elt

当我将域名保存为:

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

值在数据库中插入如下:

student table
ID  VERSION     FIRST_NAME      LAST_NAME  
1     0         Piyush          Chaudhari

student_address表

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

现在,我希望使用GORM的数据或行,例如Student.findBy _____或Student.findAllBy ______ 'city'= surat

任何人都可以帮我解决这个问题吗?

3 个答案:

答案 0 :(得分:2)

您可以使用:

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

或者:“

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

`

答案 1 :(得分:0)

定义一个地址类,然后将地址字段添加到student类(这将改变表在数据库中的映射方式):

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

class Address {
    String city
    String state
    String pincode
}

地址应该是您域中的另一个实体,而不是值的映射。请记住,Grails GROM是一个ORM,因此您应该使用OOP模型设计您的域,以便利用动态查找器和标准来进行查询。

根据这些变化,您现在可以使用简单的标准:

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

有关grails文档中标准的更多信息: http://grails.org/doc/latest/ref/Domain%20Classes/withCriteria.html http://grails.org/doc/latest/guide/single.html#criteria

如果您想使用动态查找器,则必须使用city =&#39; surat&#39;来获取所有地址。然后使用findByAddressInList(...)。但我认为在这种情况下,标准是一种更好的方法

答案 2 :(得分:0)

我不认为你可以使用地图搜索这样的东西。

也许你可以这样做:

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

但这是做这种事情的一种非常糟糕的方式