微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在 Spring Data JPA 关联中使用派生列

如何解决如何在 Spring Data JPA 关联中使用派生列

我有一个实体 TeamActivity

@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;
}
  1. 两个表中除了 PK 之外的任何其他列都没有索引。
  2. 没有在这些表之间创建任何关系的 FK 约束。我不知道为什么,因为这是一个遗留系统。
  3. 从技术上讲,如果我获取 TeamActivity 记录,我可以从中挑选 scope_idactivity_set_id 并将它们组合成一个 scoped_activity_set_id,这将是一个有效的 PK获取相应的 ActivitySet
  4. 我知道 TeamActivity -> ActivitySet一个 N -> 1 关联

我想利用 Spring Data JPA 功能创建从 TeamActivityActivitySet 的关联,这样当我从 TeamActivity 获取 TeamActivityRepository 时,相应的 {{ 1}} 也被返回。 在使用 ActivitySet@JoinColumn 的组合之前,我已经创建了一个这样的关联,但实际上有一个 FK 可供使用,这里的源表有 2 列我可以组合以获取目标的键.

解决方法

如果您完全控制数据库,我可能建议您创建一个物化视图,其中包含您希望从两个表中获得的内容,并像使用 JPA 的任何其他表一样处理它,即创建 { {1}} 模型和 @Entity

如果您不能完全控制数据库,实现它的一种简单方法是简单地创建一个方法,该方法在内部执行两个查找查询并检索您想要的预期模型。您仍将正确使用 JPA。

在非规范化数据库中,查询两个表并在代码层连接所需字段非常常见,有时您希望避免物化视图的开销。

CrudRepository<MVTeamActivitySet,String>

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。