【问题标题】:Grails gorm findBy* with interface properties具有接口属性的 Grails gorm findBy*
【发布时间】:2015-08-24 08:13:09
【问题描述】:

我确实找到了与此相关的问题,并且我也遇到了同样的问题。链接: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 属性。

谢谢

【问题讨论】:

  • 创建另一个实现你的接口的domian类,然后在你的域中使用它。
  • 如果我理解你的评论正确域看起来像 > interface IterfaceClass { } anotherClass implements InterfaceClass { } domain { AnotherClass anotherClass } code 是吗?但是,在我们的案例中,它是以下场景域 { IterfaceClass interfaceClass }
  • 对垃圾邮件感到抱歉。但为了清楚起见:如果我正确理解您的评论,域将具有实现接口的域类,而不是具有接口作为属性的域。那正确吗?但是,就我们而言,是后者;域在其属性上具有接口。
  • 你能发布你的界面和域名吗?
  • 我为此在我们的模型上添加了设置。拥有 NonEnumDomain 类的原因有 interfaceClass,因为有几个 EnumClass 正在实现 InterfaceClass。谢谢

标签: grails interface grails-orm


【解决方案1】:

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

假设您希望在您的接口类中有两个名为:name 和 description 的属性。在那里创建 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
    }
}

现在要使查找器方法适用于您的 InterfaceClass,您只需将域类中的 interfaceClass 属性添加到 embedded 属性列表。

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")) 

嵌入式关键字的定义:

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

【讨论】:

  • 甜蜜。非常感激。谢谢! PS。抱歉,由于代表要求,我还不能投票。
猜你喜欢
  • 2012-05-08
  • 2015-01-23
  • 1970-01-01
  • 1970-01-01
  • 2023-01-01
  • 2021-01-29
  • 1970-01-01
  • 2016-03-18
  • 1970-01-01
相关资源
最近更新 更多