What\'s the best/easiest way to get a list of the persistent properties associated with a given GORM domain object? I can get the list of all properties, but this list cont
Try this:
import org.codehaus.groovy.grails.commons.DefaultGrailsDomainClass
...
def d = new DefaultGrailsDomainClass(YourDomain.class)
d.persistentProperties
Here's a link to the Grails API for GrailsDomainClass (it's a link to an older version; I couldn't find a newer one after some quick searches). It's got a getPersistentProperties()
(used in the code snippet above). You can traverse the API documentation to see what other methods might be useful to you.
If you want an example, do a grails install-templates
and then look at src/templates/scaffolding/create.gsp
. There's a block in there where it iterates over the persistent domain properties.
As of grails 3.3.0
All code that uses the
GrailsDomainClass
orGrailsDomainClassProperty
classes should be re-written to use the mapping context api.To get started, inject the
grailsDomainClassMappingContext
bean. See the api documentation for more information on theMappingContext
,PersistentEntity
(GrailsDomainClass), andPersistentProperty
(GrailsDomainClassProperty)
For example:
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
}
}
}
Hope this helps someone.
Now (strarting Grails 2.x) you don't even have to instantiate new DefaultGrailsDomainClass(...)
and avoid unnecessary code executions. All domain class objects have injected property domainClass
:
def domainObject = new YourDomain()
domainObject.domainClass.persistentProperties
Or, if you haven't domain class object, you can get DefaultGrailsDomainClass
from application context by domain class name - each domain class has a DefaultGrailsDomainClass registered as a Spring bean. So you can use, for example, Holders
(assuming your domain class name is 'Foo'):
def defaultGrailsDomainClass = Holders.applicationContext.getBean("FooDomainClass")
defaultGrailsDomainClass.persistentProperties