【问题标题】:JPA Recursive LEFT OUTER JOINJPA 递归左外连接
【发布时间】:2013-01-18 15:08:43
【问题描述】:

我有一个名为Status 的实体,它(除其他外)与其自身具有多对多关系,代表“可能的下一个状态”。

这个想法是能够创建状态之间转换的“地图”。

现在,我正在尝试生成一个尚未链接到给定状态的状态列表,以填充“链接到此状态”表单中的组合框(换句话说,我想要那些可以链接)。

到目前为止,我已经找到了 25 种不这样做的方法。 :)

好的,所以很多人都在询问更多细节 - 我认为在合理的数据库设计方面有些事情是理所当然的(实际上它们对于答案并不重要)。

a) 所有状态都有一个且只有一个 KEY 列,即它们的主键。

b) 状态通过连接表相互“连接”,该连接表有 2 个外键,都是状态的主键。

c) 如果我有状态 A、B、C 和 D - 并且我已经将状态 B 和 C 链接到 A 所以我有:A -> B 和 A -> C 目的是找到状态表中存在的那些尚未连接到“A”的状态。当我说“A”时,我的意思是作为参数给出的状态。所以,如果我正在查看状态 A,我希望所有未连接到“A”的人。如果我正在查看状态 C,我希望所有未连接到状态 C 的人,无论它们是否连接到不同的状态。

任何帮助将不胜感激。 我不是在逐字寻找确切的查询,而是在寻找“可以完成的方式”。我很容易弄清楚如何在我的特定数据库设计中应用该原则,但我找不到要应用的“原则”。

【问题讨论】:

  • 如果不更好地理解设计,就很难回答这个问题。例如,我不确定为什么需要递归左外连接。另一个例子,我不知道为什么如果您的状态有一个表示自身链接的字段,为什么您不需要查询链接字段为空的所有状态来收集所有未链接的状态。但这可能是因为我不明白您要做什么。
  • 您好,它没有链接到自身的字段 - 它是 MANY TO MANY 关系,因此使用单独的 Join 表来匹配对。
  • 你能发布你的架构吗?您基本上有一个带有代理键的模式表和另一个关系表,其中有两个字段是状态表 PKEY 的 FKEY?而您只是想查询 Status 中关系表中没有行的所有行?如果您不认为我们在您的脑海中并为我们提供更多详细信息,您将获得更好的答案。也许发布实体或架构。

标签: jpa many-to-many jpql recursive-query


【解决方案1】:
select notLinkedStatus from Status notLinkedStatus
where notLinkedStatus.id not in
    (select linkedStatus.id from Status status
     inner join status.linkedStatuses linkedStatus
     where status.id = :theStatusId)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-04
    • 2011-10-01
    • 1970-01-01
    • 2016-10-02
    • 1970-01-01
    • 2011-09-10
    • 2014-02-24
    • 1970-01-01
    相关资源
    最近更新 更多