gpt4 book ai didi

grails - 如何在 grails 中使用鉴别器实现 tablePerHierarchy?

转载 作者:行者123 更新时间:2023-12-01 18:58:39 24 4
gpt4 key购买 nike

我有一个类层次结构:

class Item {}
class Participation extends Item{}
class Contribution extends Participation{}
class Question extends Participation{}

我想每个类都有一个表,所以我在 Item 中添加 tablePerHierarchy false

我需要一个鉴别器来实现查询:where class = "Contribution"

我尝试了很多实现,但都没有用。

怎么做?

谢谢

最佳答案

你想要每个层次结构的表还是每个类的表?你的问题不清楚。

对于以下领域对象,您可以采用任何一种方式:

// Item.groovy
class Item {
String x
}

// Participation.groovy
class Participation extends Item {
String y
}

使用默认的每个层次结构表策略,将只使用一个表来存储项目和项目的所有子类。默认的鉴别器列称为 class,grails 将自动使用它。 grails schema-export 生成的模式如下所示:

create table item (
id bigint generated by default as identity (start with 1),
version bigint not null,
x varchar(255) not null,
class varchar(255) not null,
y varchar(255),
primary key (id)
);

两个类只有一个表,其中包含层次结构中每个类中声明的所有字段以及鉴别器列 class。如果您执行类似 Participation.list() 的查询,grails 生成的 SQL 如下所示:

select
this_.id as id1_0_,
this_.version as version1_0_,
this_.x as x1_0_,
this_.y as y1_0_
from
item this_
where
this_.class='Participation'

通过在 Item.groovy 中使用 static mapping { tablePerHieracrchy false } 将继承策略更改为每个类的表,grails 将为层次结构中的每个类生成一个表。每个表仅存储在每个类中声明的字段,因此 Participation 对象将由 Item 表和 Participation 表中的一行表示。架构如下所示:

create table item (
id bigint generated by default as identity (start with 1),
version bigint not null,
x varchar(255) not null,
primary key (id)
);

create table participation (
id bigint not null,
y varchar(255) not null,
primary key (id)
);

Participation.list() 的 SQL 更改为:

select
this_.id as id1_0_,
this_1_.version as version1_0_,
this_1_.x as x1_0_,
this_.y as y2_0_
from
participation this_
inner join
item this_1_
on this_.id=this_1_.id

关于grails - 如何在 grails 中使用鉴别器实现 tablePerHierarchy?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5192375/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com