2011-04-24 9 views
8

Tengo algunos problemas con la proyección en Grails. ¿Podría ayudarme a revisarlos y sugerir soluciones para mí?Grails: ¿Proyección en muchas tablas?

  1. Quiero consultar datos en muchas tablas que tienen una relación de varios a uno y una proyección en algunas propiedades en ambos. Por ejemplo:

    class Person { 
        int id 
        String name 
        String address 
        static hasMany = [cars : Car] 
    } 
    
    class Car { 
        int id 
        String brand 
        long price 
        Person owner 
        static belongsTo = [owner : Person] 
    } 
    

    Así que, ¿cómo puedo usar sólo una withCriteria consulta (aplicar proyección) para obtener información de un coche determinado (incluya la marca, el precio y el nombre del propietario)? ¿Es posible utilizar:

    Car.withCriteria { 
        projections { 
         property("brand") 
         property("price") 
         property("owner.name") 
        } 
        eq("id", carId) 
    } 
    
  2. ¿Puedo usar una proyección para obtener información de una persona especificada junto con el nombre de todos sus coches? Por ejemplo: [01, Perter, 01 Street A, [Mercedes, Toyota, Ducatti]]?

  3. Una situación especial: (con clase de persona arriba)
    Una persona puede unirse a muchos Organización, y una organización puede tener uno Organizaciones "padre" (y viceversa, una organización puede tener muchas otras organizaciones dependen). Pero hay una regla: una persona solo puede unirse a una sola organización infantil de una organización determinada. Entonces, con una organización dada O y una persona P, ¿cuál es la forma más rápida de obtener información de P junto con el nombre de la organización dependiente de O que tiene P como miembro? Prefiero usar la proyección de Grails.

    Aquí es modelo de datos:

    class Person { 
        int id 
        String name 
        String address 
        static hasMany = [joinedOrgs : Organization] 
    } 
    
    class Organization { 
        int id 
        String name 
        Organization parentOrg 
        static hasMany = [members : Person, childOrgs : Organization] 
    } 
    

Soy un novato con Grails, y me gustaría entender GORM mucho más. Muchas gracias por tu ayuda.

Respuesta

1

Para (1) y (2), no sé si hay una manera de hacer lo que quiera con solo 1 criterio de búsqueda, pero la forma alternativa es simplemente más simple y natural. Para (1):

def car = Car.get(carId) 
def owners = car.owner?.name 

para (2)

def person = Person.get(personId) 
def cars = person.cars*.name 

Acerca de (3), que es una especie de problema de diseño aquí. Su diseño de dominio actual no refleja la regla que describe, por lo que será difícil mantener esa restricción. Puede considerar mapear una tabla PersonOrganization y make childrenOrganization a transient property. Por ejemplo:

class Organization { 
    int id 
    String name 
    Organization parent 
    static transients = ['children'] 
    ... 

    Boolean children() { 
     def children = Organization.createCriteria().list() { 
      eq ('parent', this) 
     } 
     return children 
    } 
} 

Después de eso, se puede utilizar una función de rastreo como getAllAncestors() para determinar todos los padres y la jerarquía de una organización, la mirada hacia arriba en la lista de persona-organización. Parece que no es la mejor manera, pero esa es una forma posible.

3

Para (No.1) Creo que lo que está buscando se explica aquí

http://grails.1312388.n4.nabble.com/grails-reports-page-multiple-domain-criteria-join-td3510604.html

def criteria = Company.createCriteria() 
    def results = criteria.list { 
     projections { 
       property('id', 'company.id') 
       ... 
       POCs{ 
         property('id', 'poc.id') 
         property('name', 'poc.name') 
       } 
       software { 
         productKey { 
           ... 
           } 
       } 
       ... 
       order(company.name,'asc') 
     } 

los aspectos más destacados de correos utilizando .createCriteria()

10

probar este

def results = Car.createCriteria().list() { 
    createAlias('owner','owner') 
    projections { 
     property('owner.name', 'owner.name') 
     property('brand','brand') 
     property('price','price') 
    } 
} 
+0

¿Por qué se necesita el 'alias'? –

+0

@AlexanderSuraphel sin alias no puede acceder 'owner.name' directamente en ' propiedad ('owner.name', 'owner.name') ' Incluso puede obtener los resultados anteriores sin alias pero necesita escribir más código para esto . véase más adelante ejemplo 'proyecciones { propietario { propiedad ('nombre', 'nombre') } propiedad ('marca', 'marca') propiedad ('precio', 'precio') }' favor avíseme si todavía tiene alguna confusión o no fue la respuesta correcta para usted. Gracias –

+0

@AlexanderSuraphel Si puede escribir el código anterior sin 'createAlias ​​('owner', 'owner')' de lo que es posible en las versiones más nuevas de grails –

Cuestiones relacionadas