Java MySQL与入口关系的连接

Java MySQL与入口关系的连接,java,mysql,Java,Mysql,我有一个MySQL表,如下所示: CREATE TABLE `objects` ( `id` INT NOT NULL, `foo` VARCHAR ( 32 ) NOT NULL, `bar` VARCHAR ( 32 ) NOT NULL, PRIMARY KEY ( `id` ) ); public class Obj { private final Set<Obj> relations = new HashSet<>(); // ..

我有一个MySQL表,如下所示:

CREATE TABLE `objects` (
  `id` INT NOT NULL,
  `foo` VARCHAR ( 32 ) NOT NULL,
  `bar` VARCHAR ( 32 ) NOT NULL,
  PRIMARY KEY ( `id` )
);
public class Obj {

  private final Set<Obj> relations = new HashSet<>();

  // ...

}
SELECT id1, o1.foo foo1, o1.bar bar1, id2, o2.foo foo2, o2.bar bar2
FROM `relations` r
JOIN `objects` o1 ON o1.id = r.id1
JOIN `objects` o2 ON o2.id = r.id2
多个对象之间可以有某些关系,如下表所示:

CREATE TABLE `relations` (
  `id1` INT NOT NULL,
  `id2` INT NOT NULL,
  PRIMARY KEY ( `id1`, `id2` )
  FOREIGN KEY ( `id1`, `id2` ) REFERENCES `objects` ( `id` ) ON DELETE CASCADE
);
如果两个对象彼此具有某种关系,则将一个条目放入
关系
表中,其中
id1
为第一个对象的id,
id2
为第二个对象的id。现在我想加载对象及其与其他对象的关系,并将它们存储在Java对象中,如下所示:

CREATE TABLE `objects` (
  `id` INT NOT NULL,
  `foo` VARCHAR ( 32 ) NOT NULL,
  `bar` VARCHAR ( 32 ) NOT NULL,
  PRIMARY KEY ( `id` )
);
public class Obj {

  private final Set<Obj> relations = new HashSet<>();

  // ...

}
SELECT id1, o1.foo foo1, o1.bar bar1, id2, o2.foo foo2, o2.bar bar2
FROM `relations` r
JOIN `objects` o1 ON o1.id = r.id1
JOIN `objects` o2 ON o2.id = r.id2
但是,对于与
id
匹配的
id2
的任何
关系
行,这只会选择给我
id1
,但对于与
id
匹配的
关系
行,它不会给我
id1
id2

是否有可能以某种方式选择两者

示例:我在表格中输入了以下数据:

INSERT INTO `objects` ( `foo`, `bar` ) VALUES ( 'hi', 'this' );
INSERT INTO `objects` ( `foo`, `bar` ) VALUES ( 'is', 'an' );
INSERT INTO `objects` ( `foo`, `bar` ) VALUES ( 'example', 'row' );
INSERT INTO `relations` VALUES ( 1, 2 );
INSERT INTO `relations` VALUES ( 3, 1 );

当我现在从
objects
中选择
id
为1的行时,我希望有一行具有
id
foo
bar
,以及一个关系列表(应该是2和3)

如果我理解正确,您希望选择所有相关的对象。这可以通过以下方式完成:

CREATE TABLE `objects` (
  `id` INT NOT NULL,
  `foo` VARCHAR ( 32 ) NOT NULL,
  `bar` VARCHAR ( 32 ) NOT NULL,
  PRIMARY KEY ( `id` )
);
public class Obj {

  private final Set<Obj> relations = new HashSet<>();

  // ...

}
SELECT id1, o1.foo foo1, o1.bar bar1, id2, o2.foo foo2, o2.bar bar2
FROM `relations` r
JOIN `objects` o1 ON o1.id = r.id1
JOIN `objects` o2 ON o2.id = r.id2

如果我理解正确,您希望选择所有相关对象。这可以通过以下方式完成:

CREATE TABLE `objects` (
  `id` INT NOT NULL,
  `foo` VARCHAR ( 32 ) NOT NULL,
  `bar` VARCHAR ( 32 ) NOT NULL,
  PRIMARY KEY ( `id` )
);
public class Obj {

  private final Set<Obj> relations = new HashSet<>();

  // ...

}
SELECT id1, o1.foo foo1, o1.bar bar1, id2, o2.foo foo2, o2.bar bar2
FROM `relations` r
JOIN `objects` o1 ON o1.id = r.id1
JOIN `objects` o2 ON o2.id = r.id2

如果只需要与特定id关联的记录,只需执行以下操作:

select * 
from objects 
where id in (
    select max(id1, id2) 
    from relations 
    where min(id1, id2)='the desired id'
);

如果只需要与特定id关联的记录,只需执行以下操作:

select * 
from objects 
where id in (
    select max(id1, id2) 
    from relations 
    where min(id1, id2)='the desired id'
);

你想得到什么?一个图形或仅仅是一个对象列表,在每个对象上都有一组其他对象?我的意思是,假设你的桌子上只有两个对象,它们之间有关系。在主函数中,创建第一个函数的obj(第一个)。。。如果您先执行.getOtherObjs().first().getOtherObjs().first(),您希望有一个指向原始对象的对象还是什么?假设有3个id为1、2、3的对象。1与关系表中注册的2和3相关,有两行:一行为
id1=1
id2=2
,一行为
id1=3
id2
=
1
。现在我想选择id为1的对象,并在一个查询中获得与对象2和3的关系。请注意,在一个关系中,对象1被放入
id1
,而在另一个关系中,对象id被注册在
id2
中。更新您的问题添加适当的数据样本和预期结果+由于所需对象的id可以在关系中的id1或id2中,您必须进行两次选择。您希望得到什么结果?一个图形或仅仅是一个对象列表,在每个对象上都有一组其他对象?我的意思是,假设你的桌子上只有两个对象,它们之间有关系。在主函数中,创建第一个函数的obj(第一个)。。。如果您先执行.getOtherObjs().first().getOtherObjs().first(),您希望有一个指向原始对象的对象还是什么?假设有3个id为1、2、3的对象。1与关系表中注册的2和3相关,有两行:一行为
id1=1
id2=2
,一行为
id1=3
id2
=
1
。现在我想选择id为1的对象,并在一个查询中获得与对象2和3的关系。请注意,在一个关系中,对象1被放入
id1
,而在另一个关系中,对象id被注册在
id2
中。更新您的问题添加适当的数据样本和预期结果+,因为所需对象的id可以在关系中的id1或id2中,你必须做两个选择。如果我使用
JOIN
LEFT JOIN
以及是否添加
groupby
是否重要?我只希望每个对象有一行作为最终结果,并将关系列表添加到该行中。当另一端可能为空时,需要左连接。由于id1和id2不为null,因此情况并非如此。如果您只想将相关对象添加到一个对象,只需添加一个where子句:where id1=XXX如果我使用
JOIN
LEFT JOIN
以及是否添加
groupby
是否重要?我只希望每个对象有一行作为最终结果,并将关系列表添加到该行中。当另一端可能为空时,需要左连接。由于id1和id2不为null,因此情况并非如此。如果只希望相关对象与一个对象关联,只需添加where子句:where id1=XXX