gpt4 book ai didi

JPA 继承 : Query fails with unknown column

转载 作者:行者123 更新时间:2023-12-05 00:28:45 25 4
gpt4 key购买 nike

使用 EclipseLink v2.7.4 时执行以下 JPA 查询:

SELECT pr FROM AbstractProduct pr WHERE pr.shelve.superMarket.id = :1 ORDER BY pr.sortOrder

给出以下错误:
Unknown column 't0.SORTORDER' in 'order clause'
Error Code: 1054
Call: SELECT t2.ID, t2.SORTORDER, t2.SHELVE_ID FROM APPLE t2, SHELVE t1 WHERE ((t1.SUPERMARKET_ID = ?) AND (t1.ID = t2.SHELVE_ID)) ORDER BY t0.SORTORDER
bind => [12]

该查询引用 t0,但在生成的查询中没有任何地方定义 t0 是哪个表。

这些是我正在使用的实体:
@Entity
public class SuperMarket {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;

@OneToMany(mappedBy = "superMarket")
List<Shelve> shelves;
}

@Entity
public class Shelve {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;

protected SuperMarket superMarket;

@OneToMany(mappedBy = "shelve")
protected List<AbstractProduct> products;
}

@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class AbstractProduct {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;

protected Shelve shelve;

protected long sortOrder;
}

@Entity
public class Apple extends AbstractProduct {

}

@Entity
public class Banana extends AbstractProduct {

}

这导致以下查询:
CREATE TABLE SUPERMARKET (ID BIGINT NOT NULL, PRIMARY KEY (ID));
CREATE TABLE SHELVE (ID BIGINT NOT NULL, SUPERMARKET_ID BIGINT, PRIMARY KEY (ID));
CREATE TABLE APPLE (ID BIGINT NOT NULL, SORTORDER BIGINT, SHELVE_ID BIGINT, PRIMARY KEY (ID));
CREATE TABLE BANANA (ID BIGINT NOT NULL, SORTORDER BIGINT, SHELVE_ID BIGINT, PRIMARY KEY (ID));
CREATE TABLE ABSTRACTPRODUCT (SHELVE_ID BIGINT);

最后一个表 ABSTRACTPRODUCT 不应该被创建,因为它是一个抽象 Java 实体,我正在使用每个类继承样式的表。这似乎是 eclipselink 中的一个错误,它也在这个问题中进行了讨论: Understanding of TABLE_PER_CLASS with keys in eclipselink似乎触发create table 语句的是继承与OneToMany 关系的组合。不确定这个错误是否与我在开始时提到的查询错误有关。我认为不是,因为这个表甚至没有排序顺序字段。

当我删除 ORDER BY 子句时,查询将成功执行。当我将查询更改为仅上一级时,它也会成功执行:
SELECT pr FROM AbstractProduct pr WHERE pr.shelve.id = :1 ORDER BY pr.sortOrder

对于测试,我摆脱了继承,让 Shelve 实体直接与 Apple 建立 OneToMany 关系,其中 Apple 没有扩展任何其他类,在这种情况下,查询也会成功执行。但我需要抽象类和继承。

知道为什么在这种情况下生成的查询是错误的吗?

正如下面的答案所指出的,我可以使用不同的继承策略以不同的方式解决这个问题。我选择每个类类型的表,因为这允许我在查询中使用抽象实体,而具体类得到一个包含所有字段的表。我希望在执行大量插入和从具体类中选择时这有助于提高性能,因为这只会涉及单个 db 表。

更新
我认为这是 EclipseLink 中的错误我创建了两个错误报告:
https://bugs.eclipse.org/bugs/show_bug.cgi?id=549866对于创建表的抽象类
https://bugs.eclipse.org/bugs/show_bug.cgi?id=549868对于查询中的错误

最佳答案

我能够使用继承策略重现您的问题 TABLE_PER_CLASS .一旦我将其更改为 InheritanceType.JOINED,查询就会按预期执行并重新创建了数据库的架构(在我的例子中:PostgreSQL 10.9)。

所以代码应该改为:

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public abstract class AbstractProduct {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;

@ManyToOne
protected Shelve shelve;

protected long sortOrder;
}

记好 :
  • 我添加了缺失的 @ManyToOne属性注释 shelve .
  • @ManyToOne也应该添加到 protected SuperMarket superMarket;在实体Shelve .

  • 生成的数据库架构如下所示:
    CREATE TABLE public.abstractproduct
    (
    id bigint NOT NULL,
    dtype character varying(31) COLLATE pg_catalog."default",
    sortorder bigint,
    shelve_id bigint,
    CONSTRAINT abstractproduct_pkey PRIMARY KEY (id),
    -- FK definitions left out for brevity
    )

    Apple ,例如,变成:
    CREATE TABLE public.apple
    (
    id bigint NOT NULL,
    CONSTRAINT apple_pkey PRIMARY KEY (id),
    -- FK definitions left out for brevity
    )

    希望能帮助到你。

    关于JPA 继承 : Query fails with unknown column,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57395281/

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