2010-12-29 2 views
30

Каков наилучший/простой способ получить список постоянных свойств, связанных с данным объектом GORM domain? Я могу получить список всех свойств, но этот список содержит непостоянные поля, такие как class и constraints.Извлечение списка постоянных свойств GORM для домена

В настоящее время я использую это и фильтрации списка 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 
     } 
    } 

Там кажется, что там должен быть лучший способ получить только постоянные свойства.

+0

Чтобы быть более явным, persistentProperties предоставляет имена свойств, а не значения. getProperties() по-прежнему необходимо, если вам нужны оба ключа и значения свойств. Сбив с толку, поскольку Горм не согласуется с его использованием термина «свойство» –

ответ

46

Попробуйте это:

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

Вот ссылка на API Grails для GrailsDomainClass (это ссылка на старую версию, я не мог найти новый один за несколько быстрых поисков). У него есть getPersistentProperties() (используется в фрагменте кода выше). Вы можете просмотреть документацию API, чтобы узнать, какие другие методы могут быть полезны для вас.

Если вы хотите привести пример, выполните grails install-templates, а затем просмотрите src/templates/scaffolding/create.gsp. Там есть блок, где он выполняет итерацию над свойствами постоянных доменов.

+0

Спасибо за быстрый ответ. Я пробовал это, но я получил следующее исключение: 'groovy.lang.MissingPropertyException: Нет такого свойства: persistentProperties для класса: com.infinitecampus.standards.LLevel'. Объект LLevel - это объект GORM, который я создал с помощью нового LLevel(). Возможно, я делаю что-то еще неправильно? – lambmj

+0

Это странно. Что произойдет, если вы передадите его в GrailsDomainClass, например. '((GrailsDomainClass) domainObject) .persistentProperties'? –

+0

Пробовал это, вот что произошло: 'org.codehaus.groovy.runtime.typehandling.GroovyCastException: не может наложить объект 'Name' с классом 'com.infinitecampus.standards.LLevel' в класс 'org.codehaus.groovy.grails.commons .GrailsDomainClass'' – lambmj

13

Теперь (strarting Grails 2.x) вам даже не нужно создавать экземпляр new DefaultGrailsDomainClass(...) и избегать ненужного выполнения кода. Все объекты класса домена вводили свойство domainClass:

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

Или, если у вас есть не объект класса домена, вы можете получить DefaultGrailsDomainClass из контекста приложения от имени класса домена - каждый класс домена имеет DefaultGrailsDomainClass зарегистрирована как Spring боб , Таким образом, вы можете использовать, например, Holders (предполагается, что ваше имя класса домена является «Foo»):

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

Мне нравится это как удобство в ответ на ответ Роба. Однако правильное имя свойства фактически является persistentProperties, а не persistedProperties. –

4

По grails 3.3.0

весь код, который использует GrailsDomainClass или GrailsDomainClassProperty классы должны быть повторно написанный для использования контекста отображения api.

Для начала вставьте grailsDomainClassMappingContext бобы. Обратитесь к документации апи для получения дополнительной информации о MappingContext, PersistentEntity (GrailsDomainClass) и PersistentProperty (GrailsDomainClassProperty)

Например:

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 
     } 
    } 
} 

Надеется, что это поможет кому-то.

+0

Это помогло мне, но есть ли способ узнать, что текущая собственность разрешена к нулю или нет? Я дал ограничение в домене. Я попытался, но не получил правильные значения для ограничения и его значения. Я хочу получить ограничение, и это значение – artapart

+1

Если я не ошибаюсь, я думаю, вы должны проверить значение nullable с помощью метода 'persistentProperty.isNullable()'. Но вы не можете получить доступ к значению, если это не 'static propertey' или инициированный под объектом. Чтобы получить доступ к статическому значению свойства, вы можете использовать 'GrailsClassUtils.getStaticPropertyValue (clazz, prop)' –

+0

выше возвращает непереходные объекты для перехода через переходный период под grails 3.2+ 'def d = new DefaultGrailsDomainClass (clazz) Свойства списка = d.persistentProperties.transients. sort(). unique(). flatten() 'с указанным выше ответом получает все – Vahid

Смежные вопросы