java - Spring boot中的PostgreSQL继承命名问题

标签 java postgresql spring-boot jpa

我正在使用 PostgreSQL 处理 jpa,并且收到一个看起来很奇怪的错误。 我有下面的示例 ddl。子表具有相同的名称,具有两种不同的数据类型,并且它们与父表一起继承。

CREATE TABLE Parent
(
    id  VARCHAR(20) NOT NULL
)

CREATE TABLE child1
(
    test       double precision
)
INHERITS (Parent);


CREATE TABLE child2
(
    test       boolean
)
INHERITS (Parent);

对于实体

@Entity
@Table(
    name = "parent",
)
@NamedQuery(
    name = "parent",
    query = "SELECT p FROM Parent p"
)
@Inheritance(
    strategy = InheritanceType.TABLE_PER_CLASS
)
@Data
@NoArgsConstructor
public class Parent implements Serializable {
   @Id
   @NotNull
   @Column(name = "id")
   String id;
}

子表

@Entity
@Table(
    name = "child1"
)
@NamedQuery(
    name = "child1",
    query = "SELECT c FROM Child1 c"
)
@Data
@NoArgsConstructor
public class Child1 extend Parent {
    @Column(name = test)
    private Double test;
}

Child2 表

@Entity
@Table(
    name = "child2"
)
@NamedQuery(
    name = "child2",
    query = "SELECT c FROM Child2 c"
)
@Data
@NoArgsConstructor
public class Child2 extend Parent {
    @Column(name = test)
    private Boolean test;
}

当我使用 Controller 在父实体上创建新记录时,它将返回如下错误

错误:UNION 类型 double 和 boolean 值无法匹配

我知道 jpa 正在使用 union 来查找导致此错误的匹配结果。对于 Joined 和 SingleTable,它们在这里不起作用,因为我希望子级可以拥有父级的属性。 parent 将有自己的。每个类(class)的 table 对我来说是最好的选择。 我想知道还有其他方法可以解决这个问题吗?

最佳答案

您的 Child1Child2 类都定义了一个名为 test 的实体属性,该属性映射到具有相同名称的数据库列。当您在多态查询中从两个表中进行选择时,Hibernate 无法处理该问题。您需要更改其中一张表的列名称,以便它们在 UNION 中不会发生冲突。

关于java - Spring boot中的PostgreSQL继承命名问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58842413/

相关文章:

java - 从套接字输入流读取

带有 csv 文件的 PostgreSQL COPY 命令

java - 失败 - 上下文路径中的应用程序无法启动 <SpringBoot>

SQL:比较缺少记录的两个表,然后比较日期字段

java - userDetailsS​​ervice org.springframework.beans.factory.UnsatisfiedDependencyException 错误

java - 如何在 Hazelcast 配置中以编程方式减少 RAM?

java - 无法在recyclerview中使用exoplayer播放视频

java - 将按钮添加到自定义 View

java - 如何获取antlr4规则匹配的原文?

sql - 从一个选择中插入 2 个不同的行