【问题标题】:JPA join type for Embeddable and basic type可嵌入和基本类型的 JPA 连接类型
【发布时间】:2017-10-21 18:09:49
【问题描述】:

JPA join:可以加入Entity、Embeddable或basic类型。

@Entity
public class Book {
   @Id String id;

   @Embedded
   Author author;

   String name;
}

Root<Book> root = criteriaQuery.from(Book.class);
root.join("author", JoinType.LEFT);
// or
root.join("author", JoinType.INNER);
root.join("name", JoinType.INNER);

在 JPA api 中,加入 Embeddable 和 Basic 类型是合法的,但 JoinType 是什么意思?对于内连接属性“name”,如果 book.name 为空,查询会返回空结果吗?嵌入类型也一样?

【问题讨论】:

    标签: jpa join embeddable


    【解决方案1】:

    我认为您误解了文档。

    连接可用于OneToOneManyToOneOneToManyManyToManyElementCollection 映射。这意味着连接的目标类型可能是实体(当沿着实体关联连接时)、可嵌入(当连接到@987654326 @ 可嵌入),或基本类型(当加入基本类型的ElementCollection 时)。

    上面没有任何地方暗示将连接与基本类型的单一属性一起使用是有意义的。不过,JPA 实现可能会以供应商特定的方式处理加入此类属性的尝试。

    【讨论】:

    • 如果 Embeddable 类型有关联,则必须先加入 Embedded 属性,然后才能加入关联。所以它可以连接到一个可嵌入类型的奇异属性。
    • 并非如此。您唯一需要做的就是使用root.get() 导航从实体到嵌入属性的路径。我猜你真正要问的是如何处理嵌入属性的空值。答案是在 JPA 中,具有 null 值的嵌入属性与填充默认值的非 null 嵌入属性无法区分。
    • root.get("embeddedAttrName") 返回一个无法加入关联的 Path 实例。加入源必须是 From。
    • 正如你所提到的,非实体的 joinType 可能会被忽略。 JPA 规范没有说明任何内容。
    • 你是对的,我的错。无论如何,由于我上面描述的空值语义,连接的类型对于嵌入的属性并不重要
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-22
    • 2013-04-05
    • 1970-01-01
    • 1970-01-01
    • 2018-11-19
    • 2023-01-30
    相关资源
    最近更新 更多