我正在使用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
任何人都可以帮我解决这个问题吗?
答案 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)
但这是做这种事情的一种非常糟糕的方式