如何解决如何在 Spring Data JPA 关联中使用派生列
@Entity
@Table(name = "teams_to_activities")
public class TeamActivity {
@Column(name = "scope_id",nullable = false)
private String scopeId;
@Column(name = "team_id",nullable = false)
private String teamId;
@Column(name = "activity_set_id",nullable = false)
private String activitySetId;
@Id
@Column(name = "scoped_team_activity_id",nullable = false)
private String scopedTeamActivityId;
}
另一个实体ActivitySet
:
@Entity
@Table(name = "activity_sets")
public class ActivitySet {
@Column(name = "scope_id",nullable = false)
private String scopeId;
@Column(name = "name",nullable = false)
private String name;
@Column(name = "description",nullable = false)
private String description;
@Id
@Column(name = "scoped_activity_set_id",nullable = false)
private String scopedActivitySetId;
}
- 两个表中除了 PK 之外的任何其他列都没有索引。
- 没有在这些表之间创建任何关系的 FK 约束。我不知道为什么,因为这是一个遗留系统。
- 从技术上讲,如果我获取
TeamActivity
记录,我可以从中挑选scope_id
和activity_set_id
并将它们组合成一个scoped_activity_set_id
,这将是一个有效的 PK获取相应的ActivitySet
。 - 我知道
TeamActivity -> ActivitySet
是一个N -> 1
关联
我想利用 Spring Data JPA 功能创建从 TeamActivity
到 ActivitySet
的关联,这样当我从 TeamActivity
获取 TeamActivityRepository
时,相应的 {{ 1}} 也被返回。
在使用 ActivitySet
和 @JoinColumn
的组合之前,我已经创建了一个这样的关联,但实际上有一个 FK 可供使用,这里的源表有 2 列我可以组合以获取目标的键.
解决方法
如果您完全控制数据库,我可能建议您创建一个物化视图,其中包含您希望从两个表中获得的内容,并像使用 JPA 的任何其他表一样处理它,即创建 { {1}} 模型和 @Entity
。
如果您不能完全控制数据库,实现它的一种简单方法是简单地创建一个方法,该方法在内部执行两个查找查询并检索您想要的预期模型。您仍将正确使用 JPA。
在非规范化数据库中,查询两个表并在代码层连接所需字段非常常见,有时您希望避免物化视图的开销。
CrudRepository<MVTeamActivitySet,String>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。