【问题标题】:JPA differences between Join and JoinSetJoin 和 JoinSet 之间的 JPA 差异
【发布时间】:2015-01-16 14:06:22
【问题描述】:

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

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

join(String arg)joinSet(String arg)

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

谢谢。

【问题讨论】:

  • 这些是CriteriaQuery的方法?
  • 是的,点击链接:)

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


【解决方案1】:

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

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

【讨论】:

    【解决方案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。这意味着实现应用程序完全有可能放入一些逻辑来检测您是否尝试加入集合或单个属性,并在必要时将流程转发到 joinSet 方法。如果不知道您正在使用什么实现,我真的无法对此发表更多评论。

    grep代码here上找到的源代码

    【讨论】:

    • 您能否提供一个简单的示例来说明 Join 和 JoinSet 的单独实现?
    • ListJoin 是否也一样,只是它是 List 而不是 Set?
    猜你喜欢
    • 2010-11-23
    • 2013-08-07
    • 1970-01-01
    • 2016-10-28
    • 1970-01-01
    • 1970-01-01
    • 2012-06-15
    • 2020-09-15
    • 1970-01-01
    相关资源
    最近更新 更多