检索域的 GORM 持久属性列表

     2023-05-07     91

关键词:

【中文标题】检索域的 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 中字段值的子集?

...原始(ish)对象(字符串、枚举等)的列表。我希望能够检索其值是某个给定列表的子集的记录。为了说明,假 查看详情

Datanucleus/JDO,持久化和检索 java.util.Set 属性

】Datanucleus/JDO,持久化和检索java.util.Set属性【英文标题】:Datanucleus/JDO,persistingandretrievingjava.util.Setattribute【发布时间】:2011-06-1021:33:31【问题描述】:我的持久类中有一个Set类型的属性。我坚持到H2数据库。该类正确保留,我... 查看详情

如何使用 GORM 测试实例是不是持久化到数据库中?

】如何使用GORM测试实例是不是持久化到数据库中?【英文标题】:HowdoItestifanInstanceispersistedintheDatabasewithGORM?如何使用GORM测试实例是否持久化到数据库中?【发布时间】:2014-09-1916:48:03【问题描述】:当我将实例另存为:test.save... 查看详情

ios数据持久化之---属性列表

 属性列表(plist)  iOS提供了一种plist格式的文件(属性列表)用于存储轻量级的数据,并且只能保存NSDictionary、NSArray、NSString、NSNumber、Boolean、NSData、NSDate类型的数据。将这些类型的数据保存为plist格式文件,该格式保存的数... 查看详情

LDAP - 检索所有属性/值的列表?

】LDAP-检索所有属性/值的列表?【英文标题】:LDAP-Retrievealistofallattributes/values?【发布时间】:2011-10-0404:34:03【问题描述】:是否可以在不指定的情况下从LDAP检索所有属性/值的列表,如果可以,这怎么可能?【问题讨论】:您... 查看详情

从属性列表中检索数据

】从属性列表中检索数据【英文标题】:Retrievingdatafrompropertylists【发布时间】:2017-11-2220:44:35【问题描述】:我有一个plist数据,包含dictionaries的array,我想获取所有字典的第一个值englishletpath=Bundle.main.path(forResource:"idictionary",ofT... 查看详情

iris——整合gorm持久化的casbin的example(代码片段)

源代码:https://gitee.com/shentuzhigang/mini-project/tree/master/iris_demo/casbin_demoGoModulegogetgithub.com/kataras/iris/v12gogetgithub.com/casbin/casbin/v2gogetgorm.io/gormgogetgorm.io/driver/my 查看详情

go语言学习之旅--gorm(代码片段)

...删查改增gorm创建记录用指定的字段创建记录批量插入查检索单个对象用主键检索检索全部对象String条件Struct&Map条件更新更新单个列更新多列更新选定字段批量更新删删除一条记录根据主键删除批量删除gorm概述ORM简介对象关... 查看详情

go语言学习之旅--gorm(代码片段)

...删查改增gorm创建记录用指定的字段创建记录批量插入查检索单个对象用主键检索检索全部对象String条件Struct&Map条件更新更新单个列更新多列更新选定字段批量更新删删除一条记录根据主键删除批量删除gorm概述ORM简介对象关... 查看详情

如何从 Dart 中的类列表中检索属性?

】如何从Dart中的类列表中检索属性?【英文标题】:HowtoretrievepropertiesfromaListofClassinDart?【发布时间】:2018-06-0315:46:57【问题描述】:我在这里创建了一个包含4个元素的自定义类...classTopStringvideoId;intrank;Stringtitle;StringimageString;Top... 查看详情

检索添加到 MATLAB OOP 中的类的动态属性列表

】检索添加到MATLABOOP中的类的动态属性列表【英文标题】:RetrievethelistofdynamicpropertiesaddedtoclassinMATLABOOP【发布时间】:2015-06-2323:05:53【问题描述】:使用MATLAB,可以向类实例添加动态属性,如下所示:%Defineaclasssupportingfordynamicpro... 查看详情

gorm框架学习---crud接口之查询(代码片段)

Gorm框架学习---CRUD接口之查询环境搭建检索单个对象用主键检索检索全部对象条件String条件Struct&Map条件指定结构体查询字段内联条件Not条件Or条件选择特定字段OrderLimit&OffsetGroupBy&HavingDistinctJoinsJoins预加载join派生表(Derived... 查看详情

GORM 域类属性默认值

】GORM域类属性默认值【英文标题】:GORMdomainclasspropertiesdefaultvalues【发布时间】:2012-01-0514:20:06【问题描述】:也许是一个愚蠢的问题,但我应该在哪里/如何定义GORM域类属性的默认值?例如,当我创建一个新的Company对象实例时... 查看详情

go语言学习之旅--gorm(代码片段)

...删查改增gorm创建记录用指定的字段创建记录批量插入查检索单个对象用主键检索检索全部对象String条件Struct&Map条件更新更新单个列更新多列更新选定字段批量更新删删除一条记录根据主键删除批量删除gorm概述ORM简介对象关... 查看详情

GORM:对新属性的空检查导致 QueryException

】GORM:对新属性的空检查导致QueryException【英文标题】:GORM:nullcheckonnewpropertyleadstoQueryException【发布时间】:2018-04-1009:21:48【问题描述】:我在之前存在的域类BComponent的GORM映射中添加了一个新属性uuid:staticmapping=tablePerHierarchyfa... 查看详情

如何在 Grails/GORM 中将派生属性设置为小写?

】如何在Grails/GORM中将派生属性设置为小写?【英文标题】:HowtosetaderivedpropertytolowercaseinGrails/GORM?【发布时间】:2013-11-2307:19:24【问题描述】:这是一个新手问题——感谢您的帮助。我想在我的域模型中将派生属性设置为小写。... 查看详情

如何检索文本区域的值

】如何检索文本区域的值【英文标题】:HowToRetrievetheValueofatextarea【发布时间】:2020-05-0101:49:31【问题描述】:我正在尝试使用Cheerio访问文本区域内的文本,但其文本未显示在HTMLDom中。这是文本区域的HTML:<textareaid="MainContentP... 查看详情

数据持久化

iOS中常用的四种数据持久化方法简介 iOS中的数据持久化方式,基本上有以下四种:属性列表、对象归档、SQLite3和CoreData1.属性列表涉及到的主要类:NSUserDefaults,一般[NSUserDefaultsstandardUserDefaults]就够用了@interfaceUser:NSObject<NSCo... 查看详情