提问者:小点点

JPA-在API传入ID后,从共享相同ForeignKey的不同实体检索记录


考虑以下虚拟数据实体及其定义的关系:

实体业务

@Entity
@Table(name = "business")
public class Business {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
public Long id;

@OneToMany(mappedBy = "Business")
public List<GiveMoney> giveMoney;

@OneToMany(mappedBy = "Business")
public List<RandomForm> randomForm;

@Column(name = "name")
public String name;

--  other fields & getters and setters omitted --

实体GiveMoney

@Entity
@Table(name = "give_money")
public class GiveMoney{


@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
public Long id;

@ManyToOne
Business business;

@OneToOne
@JoinColumn(name = "random_form_id", insertable = false, updatable = false, 
referencedColumnName = "id")
public RandomForm randomForm;

@OneToOne
@JoinColumn(name = "person_giving_money_id", insertable = false, updatable = 
false, 
referencedColumnName = "id")
public PersonGivingMoney personGivingMoney;

@Column(name = "business_id", insertable = false, updatable = false)
public Long business_id;

@Column(name = "person_giving_money_id")
public Integer person_giving_money_id;

@Column(name = "random_form_id")
public Integer  random_form_id;

@Column(name = "how_much")
public Integer howMuch;

--  other fields & getters and setters omitted --

实体随机形式

@Entity
@Table(name = "random_form")
public class RandomForm{

@ManyToOne
Business business

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
public Long id;

@Column(name = "business_id", insertable = false, updatable = false)
public Long business_id;

--  other fields & getters and setters omitted --

我省略了最后一个实体,人GivingMoney,因为它只包含一个由person_giving_money_id和名称引用的ID。

请原谅下划线、可能不正确的可插入/可更新值以及通过不必要的@列注释浪费空间

自然,当我在列表GiveMoney上的控制器中执行getAll时,它将从各自的实体中检索完整的列表以及连接的列。

这是findByBusiness_id在GiveMoneyRepo

    List<GiveMoney> findByBusiness_id(Long id);

和控制器

@RequestMapping(path = "/test/{id}")
public List<GiveMoney>findAllWithGivenBusinessId(@PathVariable Long id){
    return giveMoneyRepo.findByBusiness_id(id);
 }

正如预期的那样,它将过滤GiveMoney列表并返回api中包含给定业务id的所有记录,但是它将同时返回来自同一结果集中的随机记录,即R随机表单实体和个人GivingMoney实体。我相信这是正常的,因为我刚刚通过GiveMoney存储库在GiveMoney列表中指定了我的条件,而没有告诉Spring如何处理其余的实体/记录。

随机形式和GiveMoney都持有business_id作为外键,我想在API中给出一个业务id,并检索一个列表,该列表将根据给定的id显示两个实体的正确记录。简单地说:

FindGiveMoneyByBusiness_Id

我已经阅读了留档,但显然还不够好,因为我确信Spring JPA有办法做到这一点,或者我想我可以考虑创建一个本地查询?


共1个答案

匿名用户

解决了——盯着屏幕看了几个小时后,我意识到我的关系船没有正确设置。正确设置后,由于连接,我能够用一种ID和一种方法匹配记录。