2014-12-12 3 views
1

Я использую Grails 2.2.4 и имеющий один Домен содержит значение как карту, и я хочу найти объект домена с помощью ключа карты. Пожалуйста, помогите мне решить эту проблему.Grails GORM найти по значению внутри карты домена

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 ______ где «город» = сурат

Любой может помочь мне устранили эту проблему ?

+0

Я не думаю, что вы можете сделать это с помощью карт – meurer

ответ

0

Определить класс адреса, а затем добавить поле адреса в классе студентов (это изменится, как ваши таблицы отображаются в базе данных):

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 = 'surat', а затем использовать findByAddressInList (...). Но я думаю, что в этом случае критерий - лучший подход.

+0

Я уже пробовал с этим, но получаю ошибку: Коллекция не была ассоциацией: com.grails.Student.address. StackTrace следующим образом: org.hibernate.MappingException: коллекция не была ассоциация: com.grails.Student.address \t в grails.orm.HibernateCriteriaBuilder.invokeMethod (HibernateCriteriaBuilder.java:1685) –

+0

Проблема заключается в том, что вы определили адрес как карта. Вам нужно определить ассоциацию, я обновил свой ответ – agusluc

+0

Спасибо за ваш повтор. Я знаю эту ассоциацию очень хорошо, но я столкнулся с такой проблемой, поэтому я нашел решение, чтобы исправить эту проблему. –

0

Я не думаю, что вы можете искать подобные вещи, используя карты.

Может быть, вы можете сделать это:

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

Но это очень плохой способ сделать такого рода вещи

2

Вы можете использовать:

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

Или Или: `

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

`