Grails gorm findBy *具有接口属性

时间:2015-08-24 08:13:09

标签: grails interface gorm

我确实找到了一个相关的问题,我确实遇到了同样的问题。链接:Grails FindBy* with an inteface property

是的,我们无法将Interface属性更改为抽象属性。

我已经读过findBy *无法处理接口属性,但是有关我们如何继续处理的优雅提示?

至于型号:

interface InterfaceClass {
    //method
}

class EnumClass implements InterfaceClass {
    //implementation of method
}

class NonEnumDomain {
    InterfaceClass interfaceClass
}

回到这个问题,关于findBy限制的选址链接。

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

如果社区需要知道:我们在这些界面属性上做了一些UserType,因为它是Enum属性。

由于

1 个答案:

答案 0 :(得分:1)

我假设您完全控制 InterfaceClass ,并且对于所需的属性,它声明了getter和setter方法。

因此,我们假设您希望在接口类中有两个名为:名称和描述的属性。在那里创建getter和setter方法声明,不要在那里声明属性。

interface InterfaceClass {
    String getName()

    String getDescription()

    void setName(String name)

    void setDescription(String description)
}

EnumClass类将包含这些属性,并将实现InterfaceClass。

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

现在,为了使finder方法适用于 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)

并使用finder查找实例:

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

嵌入式关键字的定义:

  

支持将域组件嵌入到域类中。嵌入式   组件不会将其数据作为常规域存储在自己的表中   阶级关系呢。相反,数据包含在所有者中   表。嵌入式组件类通常声明为相同   源文件作为拥有类或在src / groovy下的自己的文件中。   约束也可以应用于嵌入式组件的属性   使用 Validateable 注释。