【问题标题】:Join non-unique column in spring jpa加入spring jpa中的非唯一列
【发布时间】:2021-06-20 10:31:29
【问题描述】:

我想在这个论坛上找到我的问题的答案。我的问题如下,我有两个类:

@Entity
@Table(name = "a")
public class A implements Serializable{

  @Id
  private String id = UUID.randomUUID().toString();

  @Column(name = "REFERENCE_ID")
  private String referenceId;

  @Column(name = "VERSION")
  private String version;
}

@Entity
@Table(name = "b")
public class B{

  @Id
  private String id = UUID.randomUUID().toString();

  @Column(name = "REFERENCE")
  private String reference;

  @ManyToMany(fetch = FetchType.LAZY)
  @NotFound(action = NotFoundAction.IGNORE)
  @JoinColumnsOrFormulas({
        @JoinColumnOrFormula(formula = @JoinFormula(value = 
                "(select r from A r where r.reference_id = reference_id order by r.version desc limit 1)",
                referencedColumnName = "reference_id")),
        @JoinColumnOrFormula(column = @JoinColumn(name = "reference_id",
        referencedColumnName = "reference_id", insertable = false))
        })
  private A referenceId;
}

问题是reference_id 不是 b 表中的唯一键,而只是表 A 中的指示值,因此为了获取整个对应行,我必须使用连接注释中的公式进行一些过滤。 当我尝试获取我的数据时,我收到以下错误

[请求处理失败;嵌套异常是 org.springframework.dao.InvalidDataAccessResourceUsageException: 无法提取结果集; SQL [不适用];嵌套异常是 org.hibernate.exception.SQLGrammarException:无法提取 ResultSet] 与根本原因 org.postgresql.util.PSQLException: 错误:关系“a”不存在位置:309

编辑

将我的联接公式更改为时,实际上 t 可以正常工作

 @JoinFormula(value = 
            "(select r from schema_A r where r.reference_id = reference_id order by r.version desc limit 1)",
            referencedColumnName = "reference_id"))

现在的问题是该代码适用于多种环境 至于我的 application.yml 看起来有点像这样;

jpa:
database: POSTGRESQL
show-sql: true
hibernate:
  ddl-auto: update
properties:
  hibernate:
    format_sql: true
    default_schema: schema
    jdbc:
      lob:
        non_contextual_creation: true
      time_zone: UTC

感谢您的回复:)

【问题讨论】:

  • 报错说没有名字为b的表

标签: java java-8 spring-data-jpa spring-annotations joincolumn


【解决方案1】:

我同意西蒙的评论。对于 Postgres(以及一般的关系数据库),“表”和“关系”这个词是相同的,并且“关系”这个词是从哪里来的。因此,当它说“找不到关系 B”时,它的字面意思是“找不到名为 B 的表”。

您应该检查架构的连接设置,以查看这些表是否已定义/尚未定义。如果不是很明显,也许可以根据您的连接设置和适当的调试添加/编辑问题,显示您DO查看那里的关系(表格)。

【讨论】:

猜你喜欢
  • 2016-02-02
  • 1970-01-01
  • 2021-04-25
  • 1970-01-01
  • 1970-01-01
  • 2022-08-22
  • 2022-01-02
  • 2017-07-25
  • 1970-01-01
相关资源
最近更新 更多