Join 和 JoinSet 之间的 JPA 差异

JPA differences between Join and JoinSet

正如标题所说,我想知道这两种方法的区别

具体我想知道两者的区别:

join(String arg)joinSet(String arg)

因为我可以使用 join(String arg) 即使属性是一个集合,但不是相反,即使用 joinSet(String arg) 在不是集合的属性上。

谢谢。

一切都是关于类型安全的。简单的例子,您将无法在连接属性上使用条件 isEmpty,因为 isEmpty 要求参数是集合属性,因此出现人为错误的可能性较低。如果您使用正确的连接,您将得到编译时错误而不是运行时错误。

总而言之,这都是关于类型安全的——这就是为什么您仍然可以加入集合,但不能将集合加入单一属性。

连接方法用于在单个属性上创建内部连接,即一对一关系。

   /*Create an inner join to the specified single-valued attribute.
    Parameters:
    attribute target of the join
    Returns:
    the resulting join*/
74 
75     <Y> Join<X, Y> More ...join(SingularAttribute<? super X, Y> attribute);

虽然方法 joinSet 用于为一组属性创建内部连接,即一对多关系。

 /*Create an inner join to the specified Set-valued attribute.
    Parameters:
    attributeName name of the attribute for the target of the join
    Returns:
    the resulting join
    Throws:
    java.lang.IllegalArgumentException if attribute of the given name does not exist*/
182
183    <X, Y> SetJoin<X, Y> More ...joinSet(String attributeName);  

但是,如果您查看方法的 return 类型,join returns 类型的 Join 和 joinSet returns 类型的 SetJoin 实现了 Join。这意味着实现应用程序完全有可能放入一些逻辑来检测您是否正在尝试加入一个集合或单个属性,并在必要时将流程转发到 joinSet 方法。在不知道您使用的是什么实现的情况下,我真的无法对此发表更多评论。

在 grep 代码上找到的源代码 here