我想使用Enum或String代替列类来映射Grails中的表继承。
举个例子
@Entity
@Table(name = "person")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorValue("USR")
@DiscriminatorColumn(length = 3, discriminatorType = DiscriminatorType.STRING, columnDefinition = "CHAR(3) NOT NULL", name = "type")
public class People implements Serializable {
我找不到将其更改为文档的方法。
最佳答案
试图回答您的问题,但老实说,不确定由于实际问题提出的问题,您的观点会摇摆不定。继承,在提供的示例中似乎没有继承的迹象。
我的第一个指针是be here。
这确实有效或已在默认grails 3.2.8上正常工作,但是在更新最新gorm时,存在更新现有记录的问题。我放弃了,并在当时作为单独的类(class)进行了学习。
如果您的问题与每个类(class)都有桌子有关,那么上面的设置就是您需要的东西。
通常,您会这样做:
abstract class Something {
static mapping = {
cache true
//tablePerConcreteClass false
tablePerHierarchy false
//discriminator value: 'institution'
}
}
class SomethingElse extends Something {
static mapping={
//discriminator value: 'somethingElse'
}
}
抽象类定义与非抽象类定义对表的创建方式以及整个模型的工作方式具有不同的不利影响。这完全取决于需求。
上面的问题是,在查询HQL中的类时,我遇到了一个问题,当我尝试查询instance.class时,我从HQL返回了一个数字,而不是实际的domainClass实例,显然歧视是第一要点。
这些扩展类的实际窍门是,如果在HQL中,something.class不返回实际的类名尝试
String query = """ select new map(type(s) as className,s.id as id) from Something s """
现在,类型将返回实际的字符串类名称。 (也许你被困在那里)
通常,您可以在HQL中执行以下操作:
当
s.class = SomethingElse
然后做什么HQL将根据匹配的domainClass名称计算出实际的className。
不知何故,我不认为这是你想要的