如何使用 Java 和 JDBC 防止一对多关系中的重复项?
How to prevent duplicates in one to many relation using Java and JDBC?
我正在尝试制作一个联系人程序,其中列出了每个人及其电子邮件。如您所知,每个人都可以拥有多封电子邮件。例如,John Smith 有 3 封电子邮件。
public class OneToManyDB {
static final String DB_URL = "jdbc:oracle:thin:@1.1.1.1:1521:orcl";
static final String USER = "user";
static final String PASS = "pass";
static final String QUERY = "select prs.person_id, prs.first_name, prs.last_name, pe.email" +
" from persons prs" +
" left join person_emails pe on prs.person_id = pe.person_fk" +
" where prs.person_id = 1";
public static void main(String[] args) throws SQLException {
Connection conn = DriverManager.getConnection(DB_URL, USER, PASS);
if (conn != null) {
try {
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(QUERY);
while(rs.next()){
System.out.print("ID: " + rs.getInt("person_id"));
System.out.print(", First: " + rs.getString("first_name"));
System.out.print(", Last: " + rs.getString("last_name"));
System.out.println(", Email: " + rs.getString("email"));
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
如您所见,有此人的名字和姓氏以及 his/hers 电子邮件联系人。
您还可以看到列出它们的问题。输出是:
如何避免这种重复?我无法在任何地方找到纯 Java 解决方案,因为我无法使用 Hibernate。请帮忙!
我想要得到的输出是 1 条记录,其中列出了所有带有分隔符的电子邮件,或者如果这不是这种情况下的最佳做法,您可以告诉我另一种方式。
P.S。这是 person_emails table 中的数据:
嗯,他们并不完全重复 - 他们的电子邮件地址不同。所以问题是:在这种情况下,您想 return 做什么?
例如,您可以选择 return 任何 电子邮件地址;使用聚合函数有帮助,因此您可以将查询修改为例如
SELECT prs.person_id,
prs.first_name,
prs.last_name,
MAX (pe.email) email --> this
FROM persons prs LEFT JOIN person_emails pe ON prs.person_id = pe.person_fk
WHERE prs.person_id = 1
GROUP BY prs.person_id, prs.first_name, prs.last_name --> this
或者,您可能想要 return 所有 他们的电子邮件地址;使用 LISTAGG
来做到这一点:
SELECT prs.person_id,
prs.first_name,
prs.last_name,
LISTAGG (pe.email, ';') WITHIN GROUP (ORDER BY NULL) email --> this
FROM persons prs LEFT JOIN person_emails pe ON prs.person_id = pe.person_fk
WHERE prs.person_id = 1
GROUP BY prs.person_id, prs.first_name, prs.last_name --> this
我认为对 PERSON_EMAILS
table 应用 UNIQUE
约束不是一个好的选择。哎呀,我们大多数人都使用多个电子邮件地址(在工作中,私人的,还有另一个私人的,...),John Smith 也是如此。
还有其他选择,但你必须说出你真正想要的。
我正在尝试制作一个联系人程序,其中列出了每个人及其电子邮件。如您所知,每个人都可以拥有多封电子邮件。例如,John Smith 有 3 封电子邮件。
public class OneToManyDB {
static final String DB_URL = "jdbc:oracle:thin:@1.1.1.1:1521:orcl";
static final String USER = "user";
static final String PASS = "pass";
static final String QUERY = "select prs.person_id, prs.first_name, prs.last_name, pe.email" +
" from persons prs" +
" left join person_emails pe on prs.person_id = pe.person_fk" +
" where prs.person_id = 1";
public static void main(String[] args) throws SQLException {
Connection conn = DriverManager.getConnection(DB_URL, USER, PASS);
if (conn != null) {
try {
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(QUERY);
while(rs.next()){
System.out.print("ID: " + rs.getInt("person_id"));
System.out.print(", First: " + rs.getString("first_name"));
System.out.print(", Last: " + rs.getString("last_name"));
System.out.println(", Email: " + rs.getString("email"));
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
如您所见,有此人的名字和姓氏以及 his/hers 电子邮件联系人。
您还可以看到列出它们的问题。输出是:
如何避免这种重复?我无法在任何地方找到纯 Java 解决方案,因为我无法使用 Hibernate。请帮忙!
我想要得到的输出是 1 条记录,其中列出了所有带有分隔符的电子邮件,或者如果这不是这种情况下的最佳做法,您可以告诉我另一种方式。
P.S。这是 person_emails table 中的数据:
嗯,他们并不完全重复 - 他们的电子邮件地址不同。所以问题是:在这种情况下,您想 return 做什么?
例如,您可以选择 return 任何 电子邮件地址;使用聚合函数有帮助,因此您可以将查询修改为例如
SELECT prs.person_id,
prs.first_name,
prs.last_name,
MAX (pe.email) email --> this
FROM persons prs LEFT JOIN person_emails pe ON prs.person_id = pe.person_fk
WHERE prs.person_id = 1
GROUP BY prs.person_id, prs.first_name, prs.last_name --> this
或者,您可能想要 return 所有 他们的电子邮件地址;使用 LISTAGG
来做到这一点:
SELECT prs.person_id,
prs.first_name,
prs.last_name,
LISTAGG (pe.email, ';') WITHIN GROUP (ORDER BY NULL) email --> this
FROM persons prs LEFT JOIN person_emails pe ON prs.person_id = pe.person_fk
WHERE prs.person_id = 1
GROUP BY prs.person_id, prs.first_name, prs.last_name --> this
我认为对 PERSON_EMAILS
table 应用 UNIQUE
约束不是一个好的选择。哎呀,我们大多数人都使用多个电子邮件地址(在工作中,私人的,还有另一个私人的,...),John Smith 也是如此。
还有其他选择,但你必须说出你真正想要的。