tutorial query grails gorm

query - grails documentation



Recuperando una lista de propiedades persistentes GORM para un dominio (3)

¿Cuál es la mejor / más fácil forma de obtener una lista de las propiedades persistentes asociadas con un objeto de dominio GORM dado? Puedo obtener la lista de todas las propiedades, pero esta lista contiene campos no persistentes como class y constraints .

Actualmente estoy usando esto y filtrando la lista de propiedades no nonPersistent usando una lista que creé:

def nonPersistent = ["log", "class", "constraints", "properties", "errors", "mapping", "metaClass"] def newMap = [:] domainObject.getProperties().each { property -> if (!nonPersistent.contains(property.key)) { newMap.put property.key, property.value } }

Parece que debe haber una mejor manera de obtener solo las propiedades persistentes.


A partir de grails 3.3.0

Todo el código que usa las clases GrailsDomainClass o GrailsDomainClassProperty se debe volver a escribir para usar la API de contexto de asignación.

Para comenzar, inyecte el bean grailsDomainClassMappingContext . Consulte la documentación de la API para obtener más información sobre MappingContext , PersistentEntity (GrailsDomainClass) y PersistentProperty (GrailsDomainClassProperty)

Por ejemplo:

class MyService { def grailsDomainClassMappingContext //inject def accessDomainProperties(Class clazz) { PersistentEntity entityClass = grailsDomainClassMappingContext.getPersistentEntity(clazz.name) List<PersistentProperty> persistentPropertyList = entityClass.persistentProperties persistentPropertyList.each { property -> println property.name } } }

Espero que esto ayude a alguien.


Ahora (Strarting Grails 2.x) ni siquiera tiene que crear una instancia new DefaultGrailsDomainClass(...) y evitar ejecuciones de código innecesarias. Todos los objetos de clase de dominio han inyectado la propiedad domainClass :

def domainObject = new YourDomain() domainObject.domainClass.persistentProperties

O bien, si no tiene un objeto de clase de dominio, puede obtener DefaultGrailsDomainClass desde el contexto de la aplicación por nombre de clase de dominio: cada clase de dominio tiene una DefaultGrailsDomainClass registrada como Spring bean. Para que pueda usar, por ejemplo, Holders (suponiendo que su nombre de clase de dominio es ''Foo''):

def defaultGrailsDomainClass = Holders.applicationContext.getBean("FooDomainClass") defaultGrailsDomainClass.persistentProperties


Prueba esto:

import org.codehaus.groovy.grails.commons.DefaultGrailsDomainClass ... def d = new DefaultGrailsDomainClass(YourDomain.class) d.persistentProperties

Aquí hay un enlace a la API de Grails para GrailsDomainClass (es un enlace a una versión anterior, no pude encontrar una más nueva después de algunas búsquedas rápidas). Tiene un getPersistentProperties() (utilizado en el fragmento de código anterior). Puede recorrer la documentación de la API para ver qué otros métodos podrían serle útiles.

Si quiere un ejemplo, haga una grails install-templates y luego vea src/templates/scaffolding/create.gsp . Hay un bloque allí donde itera sobre las propiedades de dominio persistentes.