检索域的 GORM 持久属性列表

Posted

技术标签:

【中文标题】检索域的 GORM 持久属性列表【英文标题】:Retrieving a list of GORM persistent properties for a domain 【发布时间】:2011-06-01 02:34:33 【问题描述】:

获取与给定 GORM 域对象关联的持久属性列表的最佳/最简单方法是什么?我可以获取所有属性的列表,但是这个列表包含非持久性字段,例如classconstraints

目前我正在使用它并使用我创建的列表过滤掉 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

所有使用GrailsDomainClassGrailsDomainClassProperty 类的代码都应该重写以使用映射上下文api。

要开始,请注入 grailsDomainClassMappingContext bean。有关 MappingContextPersistentEntity (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 持久属性列表的主要内容,如果未能解决你的问题,请参考以下文章

Gorm框架学习---CRUD接口之查询

Go语言学习之旅--gorm

Go语言学习之旅--gorm

Go语言学习之旅--gorm

从属性列表中检索数据

播放从保存的 persistentid 列表中检索到的 iPod 播放列表