具有接口属性的 Grails gorm findBy*

Grails gorm findBy* with interface properties

我确实找到了一个与此相关的问题,我也有同样的问题。 link : Grails FindBy* with an inteface property

是的,我们不能将接口 属性 更改为抽象 属性。

我读到 findBy* 无法处理接口 属性 但是关于我们如何继续这个的任何优雅提示?

至于型号:

interface InterfaceClass {
    //method
}

class EnumClass implements InterfaceClass {
    //implementation of method
}

class NonEnumDomain {
    InterfaceClass interfaceClass
}

回到这个问题,也就是关于 findBy 限制的站点 link。

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

以防社区需要知道:我们对这些接口属性做了一些 UserType,因为它是枚举属性。

谢谢

这里我假设您可以完全控制 InterfaceClass 并且对于所需的 属性 它具有 getter 和 setter 方法声明。

假设您希望在界面 class 中有两个名为 name 和 description 的属性。在那里创建 getter 和 setter 方法声明,不要在那里声明属性。

interface InterfaceClass {
    String getName()

    String getDescription()

    void setName(String name)

    void setDescription(String description)
}

EnumClass class 将包含这些属性并将实现 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
    }
}

现在要使查找器方法适用于您的 InterfaceClass,您只需添加 interfaceClass 属性域 class 到 嵌入式 属性列表。

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 embedding domain components into domain classes. An embedded component does not store its data in its own table as a regular domain class relationship does. Instead, the data is included in the owner's table. The embedded component class is typically declared in the same source file as the owning class or in its own file under src/groovy. Constraints can also be applied over properties of embedded components using Validateable annotation.