检索域的 GORM 持久属性列表
Posted
技术标签:
【中文标题】检索域的 GORM 持久属性列表【英文标题】:Retrieving a list of GORM persistent properties for a domain 【发布时间】:2011-06-01 02:34:33 【问题描述】:获取与给定 GORM 域对象关联的持久属性列表的最佳/最简单方法是什么?我可以获取所有属性的列表,但是这个列表包含非持久性字段,例如class
和constraints
。
目前我正在使用它并使用我创建的列表过滤掉 nonPersistent
属性列表:
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
似乎必须有更好的方法来获取持久属性。
【问题讨论】:
更明确地说,persistentProperties 只提供属性名称,而不提供值。如果您需要属性的键和值,getProperties() 仍然是必需的。令人困惑,因为 Gorm 与其对“财产”一词的使用不一致 【参考方案1】:试试这个:
import org.codehaus.groovy.grails.commons.DefaultGrailsDomainClass
...
def d = new DefaultGrailsDomainClass(YourDomain.class)
d.persistentProperties
这是GrailsDomainClass 的 Grails API 的链接(这是一个旧版本的链接;经过快速搜索后我找不到新版本)。它有一个getPersistentProperties()
(在上面的代码 sn-p 中使用)。您可以遍历 API 文档,看看还有哪些其他方法可能对您有用。
如果您想要一个示例,请执行grails install-templates
,然后查看src/templates/scaffolding/create.gsp
。那里有一个块,它在其中迭代持久域属性。
【讨论】:
感谢您的快速回复。我曾尝试过,但出现以下异常:groovy.lang.MissingPropertyException: No such property: persistentProperties for class: com.infinitecampus.standards.LLevel
。 LLevel 对象是我使用 new LLevel() 创建的 GORM 对象。也许我做错了什么?
这很奇怪。如果将其转换为 GrailsDomainClass 会发生什么,例如((GrailsDomainClass)domainObject).persistentProperties
?
试过了,结果如下:org.codehaus.groovy.runtime.typehandling.GroovyCastException: Cannot cast object 'Name' with class 'com.infinitecampus.standards.LLevel' to class 'org.codehaus.groovy.grails.commons.GrailsDomainClass'
在阅读了更多内容后,我更新了我的示例。试一试。【参考方案2】:
现在(从 Grails 2.x 开始)您甚至不必实例化 new DefaultGrailsDomainClass(...)
并避免不必要的代码执行。所有域类对象都注入了属性domainClass
:
def domainObject = new YourDomain()
domainObject.domainClass.persistentProperties
或者,如果您没有域类对象,您可以通过域类名称从应用程序上下文中获取DefaultGrailsDomainClass
- 每个域类都有一个注册为 Spring bean 的 DefaultGrailsDomainClass。所以你可以使用,例如,Holders
(假设你的域类名是'Foo'):
def defaultGrailsDomainClass = Holders.applicationContext.getBean("FooDomainClass")
defaultGrailsDomainClass.persistentProperties
【讨论】:
我喜欢这个作为 Rob 回答之上的便利。但是,正确的属性名称实际上是 persistentProperties,而不是persistedProperties。【参考方案3】:截至grails 3.3.0
所有使用
GrailsDomainClass
或GrailsDomainClassProperty
类的代码都应该重写以使用映射上下文api。要开始,请注入
grailsDomainClassMappingContext
bean。有关MappingContext
、PersistentEntity
(GrailsDomainClass) 和PersistentProperty
(GrailsDomainClassProperty) 的更多信息,请参阅 api 文档
例如:
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
希望这对某人有所帮助。
【讨论】:
这对我有帮助,但有没有办法找出当前属性是否允许为空?我在域中给出了约束。我试过但没有得到适当的约束值及其值。我想得到约束和它的价值 如果我没记错的话,我认为您可以使用persistentProperty.isNullable()
方法检查可空性。但是您无法访问值,除非它是 static propertey
或在对象下发起的。要访问静态属性值,您可以使用 GrailsClassUtils.getStaticPropertyValue(clazz,prop)
above 返回非瞬态对象以在 grails 3.2+ def d = new DefaultGrailsDomainClass(clazz) List properties=d.persistentProperties.transients.sort().unique().flatten()
下返回非瞬态对象,上述答案得到全部
DefaultGrailsDomainClass
类已弃用,因此我不建议使用它。
@charu-jain persistentProperty.getAssociations()
返回此实体的关联列表。这通常是getPersistentProperties()
返回的列表的子集。您可以进一步检查Association.owningSide
以确定您处于关系的哪一边。以上是关于检索域的 GORM 持久属性列表的主要内容,如果未能解决你的问题,请参考以下文章