如何为返回子实体的父实体编写Repository方法?

时间:2017-01-14 03:21:01

标签: java spring hibernate jpa spring-boot

我正在设计两个实体,一个名为Country,一个名为CountryDetail。从表的角度来看,COUNTRY表将是父表,COUNTRY_DETAIL表将是子表。在COUNTRY表中,将有一个名为COUNTRY_CODE的唯一属性(请注意,这不是主键;主键将是基于数字序列的值)。此代码将是连接到子表的外键,在此子表中,父表中的每个COUNTRY_CODE将有3个条目以3种不同语言表示国家/地区的名称。以下是实体类:

Country.java

    @Entity
    public class Country
    {
        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        @Column(name = "COUNTRY_ID")
        private long id;

        @Column(name="COUNTRY_CODE", nullable = false, unique = true)
        private String countryCode;

        /*public getters*/
    }

CountryDetail.java

  @Entity
    public class CountryDetail
    {
        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        @Column(name = "COUNTRY_DETAIL_ID")
        private long id;

        @ManyToOne
        @JoinColumn(name="COUNTRY_CODE", referencedColumnName = "COUNTRY_CODE")
        private Country country;
        @Column(nullable = false)
        private String languageCode;
        @Column(nullable = false, unique = true)
        private String countryNameInLanguage;

        /*public getters*/
    }

我的问题是,如何编写自定义" findBy ..." JpaRepository扩展中的接口方法,该扩展名为Country,它将返回CountryDetail个元素的集合,这些元素与languageCode CountryDetail属性的输入参数匹配类?

public interface CountryRepository extends JpaRepository<Country, Long>

我知道如果将存储库键入CountryDetail而不是Country,该怎么做,但我想知道如何通过父实体而不是直接通过子实体,即使输入参数(languageCode)仅存在于子实体中。

谢谢。

1 个答案:

答案 0 :(得分:2)

可能但很复杂:请参阅下面的示例:

家长:

 @Entity
    @Table(name="PARENT")
    public class Parent {


        @Id
        @Column(name="PARENT_ID")
        private int parentId;

        @Column(name="PARENT_NAME")
        private String parentName;

       @OneToOne(cascade=CascadeType.ALL,fetch=FetchType.EAGER)
       private Child child;

    }

孩子:

@Entity
@Table(name="CHILD")
public class Child {


    @Id
    @Column(name="CHILD_ID")
    private int childId;

    @Column(name="CHILD_NAME")
    private String childName;

    @OneToOne(cascade=CascadeType.ALL,fetch=FetchType.EAGER)
    private Parent parent;
}

定义从父存储库加载子实体的接口:

ChildEntity:

public interface ChildEntity {

    @Value("#{target.child.childId}")
    int getChildId() ;

    @Value("#{target.child.childName}")
    String getChildName();

}

家长存储库:

public interface ParentRepository extends JpaRepository<Parent, Integer> {


    public ChildEntity findByParentName(String parentName);

}

测试类:

ChildEntity chi=rep.findByParentName("<<NAME>>");
System.out.println(chi.getChildId()+" "+chi.getChildName());

输出:

CHILD ID 1000 CHILD NAME child1