如何为具有复合键的表编写JpaRepository

时间:2018-06-26 04:59:23

标签: spring-boot jpa java-8 spring-data-jpa

请参考所附的屏幕截图以了解表结构。

enter image description here

Empd_Id是“ Employee”表中的主键,该表又与表中的“ product”中的“ product_id”一起成为组合键的一部分。 任何员工都可以拥有多个产品,因此在这种情况下,它成为“员工-产品”表之间的“一对多”关系。现在我很困惑,我是否只需要编写1个JpaRepository接口(即用于员工)或2个JpaRepository接口(1个用于Employee,另一个用于Product)。我的直觉只是Employee表的1个界面,但是如何?

以下是我的代码段:- 第一个JPA存储库界面

public interface MyRepository extends JpaRepository<Product, EmpProd> {
}

实体:-

@Entity
@Table(name="product")
public class Product{

    @EmbeddedId
    private EmpProd empProd;

    @Column(name="product_name")
    private String commerceUserId;

    @Column(name="description")
    private String description;

对于复合键:-

@Embeddable
public class EmpProd implements Serializable{

    private static final long serialVersionUID = 1L;

    @NotNull
    @Column(name="emp_id")
    private String empId;

    @NotNull
    @Column(name="product_id")
    private String productId;

第二个Jpa存储库界面

public interface MyMainDataRepository extends JpaRepository<Employee, String> {
}

实体类:-

@Entity
@Table(name="employee")
public class Employee{

    @Id
    @NotNull
    @Column(name="emp_id")
    private String empId;

    @Column(name="first_name")
    private String firstName;

尽管我已经编写了2个独立的JPA存储库,但我坚信只需要1个,即主要的

公共接口MyMainDataRepository扩展了JpaRepository { }

但是我不知道相关的实体类和使用单一Jpa存储库获取数据,因为我是Spring Data JPA的新手。如果有人可以在这里帮助我,我将不胜感激。谢谢

2 个答案:

答案 0 :(得分:1)

就JPA而言,两个实体ProductEmployee没有任何联系。因此,您无法通过单个存储库访问这两者。

例如,如果Product实际引用了Employee,则可以使用ProductRepository加载Product,然后从那里导航到引用的{{ 1}} s。

但是,即使这可行,我猜EmployeeProduct应该被认为是不同的集合,因此应该各自拥有自己的存储库。有关该问题的更多信息,请参见Are you supposed to have one repository per table in JPA?

鉴于实体,您的存储库看起来还不错。请注意,由于使用了Employee而不是String productId,这些实体看起来确实是非典型的。

答案 1 :(得分:0)

如果要获取员工详细信息,则需要以下界面,

//get the "valueList" from response
if let valueList = obj["valueList"] as? [[String: Any]] {

  //get the conId from [String: Any]
  for item in valueList {

    if let conId = item["conId"] as? String {
        print(conId)
    }
  }
}

如果要获取产品详细信息,则需要以下界面,

public interface MyMainDataRepository extends JpaRepository<Employee, String> {
}

员工与产品表相关,迭代通过产品和相关员工进行。因此,您无法直接访问employee表并从MyRepository界面检索员工结果。