我确实找到了一个相关的问题,我确实遇到了同样的问题。链接: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属性。
由于
答案 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 注释。