Join和JoinSet之间的JPA差异

时间:2015-01-16 14:06:22

标签: java java-ee jpa jpa-2.0 criteria-api

正如标题所说,我想知道这两种方法之间的差异。

具体来说,我想知道它们之间的区别:

join(String arg)joinSet(String arg)

因为我可以使用 join(String arg),即使该属性是Set,但不是相反,即在属性上使用 joinSet(String arg)不是一套。

感谢。

2 个答案:

答案 0 :(得分:2)

所有关于类型安全。简单的示例,您无法在连接属性上使用标准isEmpty,因为isEmpty要求参数是集合属性,因此涉及人为错误的可能性较低。如果您将使用正确的连接,您将得到运行时错误的编译时错误。

总而言之,这完全取决于类型安全 - 这就是为什么你仍然可以加入集合,但不能集合加入单一属性。

答案 1 :(得分:2)

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

   /*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);  

但是,如果查看方法的返回类型,join返回类型为Join,joinSet返回类型SetJoin,它实现了Join。这意味着实现应用程序完全可以放入一些逻辑来检测您是否正在尝试加入set或single属性,并在必要时将该进程转发到joinSet方法。如果不知道你正在使用什么实现,我真的不能对此进行更多的评论。

在grep代码here

上找到的源代码