2015-08-24 4 views
1

У меня есть связанный с этим вопрос, и у меня точно такая же проблема. ссылка: Grails FindBy* with an inteface propertyGrails gorm findBy * с свойствами интерфейса

Да, мы не можем изменить свойство Interface на абстрактное свойство.

Я читал, что findBy * не может обрабатывать свойство интерфейса, но какие-либо изящные советы о том, как мы можем это сделать?

Что касается моделей:

interface InterfaceClass { 
    //method 
} 

class EnumClass implements InterfaceClass { 
    //implementation of method 
} 

class NonEnumDomain { 
    InterfaceClass interfaceClass 
} 

Возвращаясь к вопросу, а также в отношении ссылки относительно образом расположенных ограничений findBy.

NonEnumDomain.findByInterfaceClass(....) won't work. 

В случае это необходимо для сообщества, чтобы знать: мы сделали некоторые UserType на этих свойствах интерфейса, так что это свойство Enum.

Благодаря

+0

Сделайте еще один класс domian, который реализует ваш интерфейс, а затем используйте его в своем домене. –

+0

Если я правильно понял ваш комментарий домен должен был бы выглядел > интерфейс IterfaceClass { } anotherClass реализует InterfaceClass { } область { AnotherClass anotherClass } 'code' это правильно? однако в нашем случае это ниже сценарий домен { IterfaceClass interfaceClass } –

+0

извините за спам. но для ясности: Если я правильно понял ваш комментарий, домен будет иметь класс домена, реализующий интерфейс, а не домен, имеющий интерфейс как свойство. это правильно? однако, по нашему делу, его позднее; домен, имеющий интерфейс по своему свойству. –

ответ

0

Здесь я предполагаю, что у вас есть полный контроль над InterfaceClass и для требуемого имущества он имеет методы получения и установки заявленным.

Итак, предположим, вы хотели бы иметь два свойства с именем: имя и описание в вашем классе интерфейса. Создайте там описание метода getter и setter и не объявляйте свойства там.

interface InterfaceClass { 
    String getName() 

    String getDescription() 

    void setName(String name) 

    void setDescription(String description) 
} 

Класс EnumClass будет содержать эти свойства и будет реализовывать интерфейс ClassClass.

class EnumClass implements InterfaceClass { 
    String name 
    String description 

    String getName() { 
     return name 
    } 

    void setiName(String name) { 
     this.name = name 
    } 

    String getDescription() { 
     return description 
    } 

    void setDescription(String description) { 
     this.description = description 
    } 
} 

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

class NonEnumDomain { 
    InterfaceClass interfaceClass 

    static embedded = ['interfaceClass'] 
} 

Чтобы сохранить экземпляр NonEnumDomain:

new NonEnumDomain(interfaceClass: new EnumClass(name: "Sandeep Poonia", description: "Interface property in domain class")).save(failOnError: true, flush: true) 

и найти экземпляр с помощью искатели:

NonEnumDomain.findByInterfaceClass(new EnumClass(name: "Sandeep Poonia", description: "Interface property in domain class")) 

Определение внедренные ключевое слово:

Supports встраивание компонентов домена в классы домена. Вложенный компонент не сохраняет свои данные в своей собственной таблице в качестве обычного домена . Вместо этого данные включаются в таблицу владельца . Класс внедренного компонента обычно объявляется в том же исходном файле как владелец или в его собственном файле под src/groovy. Ограничения могут также применяться к свойствам внедренных компонентов с использованием Подтверждаемый аннотация.

+0

сладкий. очень признателен. благодаря! PS. извините, я не могу выдвинуть еще из-за требования rep. –