【发布时间】:2012-01-02 05:25:19
【问题描述】:
下面是一个问题,据说是 Sun 官方考试的一部分:
Reader 实体与 图书实体。两个 Reader 实体被持久化,每个实体有两个 Book 与他们相关的实体。例如,读者 1 有书 a 和 书 b,而读者 2 有书 c 和书 d。哪个查询返回一个 少于四个元素的集合?
A. 从书 b
中选择 b.reader B. SELECT r FROM Book b INNER JOIN b.reader r
C. SELECT r FROM Reader r INNER JOIN r.books b
D. SELECT r from Book b LEFT JOIN b.reader r LEFT JOIN FETCH r.books
给出的答案是 C,我认为这是不正确的。据我了解,JPA 提供程序将生成具有两个表内部连接的 SQL。因此,在所有情况下,我们都会得到 4 条记录。我已经用一对多关系运行了一个测试,并且包含了重复项。
谁错了,我还是孙?
【问题讨论】:
-
我用 Hibernate 运行了测试,也有重复。 select distinct r 可用于删除重复项。
-
感谢您的检查。我会使用 SELECT r FROM Reader r WHERE r.books is EMPTY 来获取已借书的独特读者......但是,他们声称 C 是正确的答案。
-
当然,不是空的
-
我查看了 Oracle 的教程并且更加困惑: >SELECT DISTINCT p FROM Player p, IN(p.teams) t 检索到的数据:属于一个团队的所有玩家。您也可以使用 JOIN 语句来编写相同的查询: SELECT DISTINCT p FROM Player p JOIN p.teams t 此查询也可以重写为: SELECT DISTINCT p FROM Player p WHERE p.team IS NOT EMPTY 为什么要使用 DISTINCT in后一种情况?
-
我的测试也导致重复。使用 EclipseLink 2.7.7 和 MySQL 8.0.22
标签: jpa duplicates inner-join jpql