JPA 与额外谓词的关系

问题描述 投票:0回答:1

我需要将 1:N 关系(在数据库上)映射为 1:1(在 Java 类上)。

让我解释一下:假设有 2 个实体,人员和地址。

一个人可能有许多地址(1:N 部分),但这些地址中只有一个是当前的‡(根据某些标准,可能是一个指示其货币的布尔标志或几个“不早于”和“不晚于”的日期字段) ”)。

在 SQL 中,我想要类似的东西:

SELECT p.*, a.* FROM Person p LEFT JOIN Address a ON (p.id = a.person_id AND a.is_valid = TRUE)

有一个限制,即没有一个地址或最多一个地址有效。这是在其他地方强制执行的。

如何声明Person->Address关系?

我知道连接标准是上面的

p.id = a.person_id
部分。但我需要添加额外的谓词(上面示例中的
a.is_valid = TRUE
)。

此外,这个谓词必须与 join 子句结合在一起(而不是在获取后应用的过滤器),因为存在当前没有有效地址的人的情况(尽管过去可能有很多地址)。

@Entity class Address { /* ... */}

@Entity class Person {
  /* @WhatToPutHere? */
  private Address currentAddress;
}

‡ 想想对以前地址的审计跟踪做得不好。

jpa
1个回答
0
投票

您的实体中可以同时拥有两者。当前地址和所有地址列表。

@Entity
public class Person {

    /* anyother properties */

    @OneToOne
    @JoinColumn(name = "current_address_id")
    private Address currentAddress;

    @OneToMany(mappedBy = "person")
    private Set<Address> addresses;

}
© www.soinside.com 2019 - 2024. All rights reserved.