我正在设计两个实体,一个名为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
)仅存在于子实体中。
谢谢。
答案 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