Moo*_*ose 7 jpa inner-join duplicates jpql
以下是一个据称是Sun官方考试的一部分的问题:
Reader实体与Book实体具有一对多的双向关系.两个Reader实体是持久的,每个实体都有两个与它们相关联的Book实体.例如,读者1有书a和书b,而读者2有书c和书d.哪个查询返回少于四个元素的Collection?
A.选择b.reader FROM Book b
B.选择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条记录.我已经进行了一对多关系的测试,并且包含了重复项.
谁错了,我还是太阳?
Moo*_*ose 14
答案来自Mike Keith,EJB 3.0共同规范主管:
规范中有两个与重复相关的陈述.
JOIN FETCH是JOIN的变体,但它确实表明类似的JOIN语义适用(除了选择了更多数据).规范(JPA v2.0的4.4.5.3节)给出了一个返回重复Department行的示例,尽管Employee对象不在select子句中.
更直接的引用是在SELECT部分(JPA v2.0的4.8节)中,它明确指出
"如果未指定DISTINCT,则不会消除重复值."
事实上,许多JPA提供商确实删除了重复项,原因如下:
a)用户的便利性,因为一些用户在SQL中不够了解并且不期望它们b)通常没有用于要求重复的用例c)它们可能被添加到结果集中并且如果对象身份被维护则重复自动消除
| 归档时间: |
|
| 查看次数: |
15008 次 |
| 最近记录: |