Spring 数据 Jpa 与 where 子句的一对一映射
Spring Data Jpa One To One mapping with where clause
我有两个表,我需要使用 where 子句进行 OneToOne 映射。
select * from person_details inner join address_details
on address_details.pid=person_details.pid AND person_details.exist_flag = 'Y' AND address_details.address_exist_flag = 'Y'
Table 1
public class PersonDetails {
@Id
private String pid;
@Column(name = "first_name")
private String firstName;
@Column(name = "last_name")
private String lastName;
@Column(name = "exist_flag")
private String existFlag;
@OneToOne(mappedBy = "personDetails", cascade = CascadeType.ALL)
@Where(clause = "addressExistFlag = 'Y'")
private AddressDetails addressDetails;
}
Table 2
@Data
@NoArgsConstructor
@Entity
@Table(name = "address_details")
public class AddressDetails {
@Id
private String pid;
private String street;
@Column(name = "address_exist_flag")
private String addressExistFlag;
@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinColumn(name = "pid", insertable = false, updatable = false)
private PersonDetails personDetails;
}
如果 addressExistFlag = 'Y' 和 existFlag = 'Y'.
我需要获取数据
在当前情况下,如果我尝试通过 spring 批量读取存储库获取数据,如下所示,仅考虑 existFlag = 'Y'。 是因为映射不正确还是我在spring批处理中使用的方式
ReadRepository 如下所示
public interface PersonDetailsRepository extends JpaRepository<PersonDetails, String> {
Page<PersonDetails> findByExistFlag(String existFlag, Pageable pageable);
}
Spring 批量读取存储库如下所示
@Bean
RepositoryItemReader<PersonDetails> personDetailsItemReader() {
Map<String, Sort.Direction> sort = new HashMap<>();
sort.put("ExistFlag", Sort.Direction.ASC);
return new RepositoryItemReaderBuilder<PersonDetails>()
.repository(personDetailsRepository)
.methodName("findByExistFlag")
.arguments("Y")
.sorts(sort)
.name("personDetailsItemReader")
.build();
}
您只是在查询 existsFlag。
您还必须添加另一个标志:
public interface PersonDetailsRepository extends JpaRepository<PersonDetails, String> {
Page<PersonDetails> findByExistFlagAndAddressDetailsAddressExistFlag(
String existFlag, String addressExistFlag, Pageable pageable);
}
@Bean
RepositoryItemReader<PersonDetails> personDetailsItemReader() {
Map<String, Sort.Direction> sort = new HashMap<>();
sort.put("ExistFlag", Sort.Direction.ASC);
return new RepositoryItemReaderBuilder<PersonDetails>()
.repository(personDetailsRepository)
.methodName("findByExistFlagAndAddressDetailsAddressExistFlag")
.arguments("Y", "Y")
.sorts(sort)
.name("personDetailsItemReader")
.build();
}
我有两个表,我需要使用 where 子句进行 OneToOne 映射。
select * from person_details inner join address_details
on address_details.pid=person_details.pid AND person_details.exist_flag = 'Y' AND address_details.address_exist_flag = 'Y'
Table 1
public class PersonDetails {
@Id
private String pid;
@Column(name = "first_name")
private String firstName;
@Column(name = "last_name")
private String lastName;
@Column(name = "exist_flag")
private String existFlag;
@OneToOne(mappedBy = "personDetails", cascade = CascadeType.ALL)
@Where(clause = "addressExistFlag = 'Y'")
private AddressDetails addressDetails;
}
Table 2
@Data
@NoArgsConstructor
@Entity
@Table(name = "address_details")
public class AddressDetails {
@Id
private String pid;
private String street;
@Column(name = "address_exist_flag")
private String addressExistFlag;
@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinColumn(name = "pid", insertable = false, updatable = false)
private PersonDetails personDetails;
}
如果 addressExistFlag = 'Y' 和 existFlag = 'Y'.
我需要获取数据在当前情况下,如果我尝试通过 spring 批量读取存储库获取数据,如下所示,仅考虑 existFlag = 'Y'。 是因为映射不正确还是我在spring批处理中使用的方式
ReadRepository 如下所示
public interface PersonDetailsRepository extends JpaRepository<PersonDetails, String> {
Page<PersonDetails> findByExistFlag(String existFlag, Pageable pageable);
}
Spring 批量读取存储库如下所示
@Bean
RepositoryItemReader<PersonDetails> personDetailsItemReader() {
Map<String, Sort.Direction> sort = new HashMap<>();
sort.put("ExistFlag", Sort.Direction.ASC);
return new RepositoryItemReaderBuilder<PersonDetails>()
.repository(personDetailsRepository)
.methodName("findByExistFlag")
.arguments("Y")
.sorts(sort)
.name("personDetailsItemReader")
.build();
}
您只是在查询 existsFlag。
您还必须添加另一个标志:
public interface PersonDetailsRepository extends JpaRepository<PersonDetails, String> {
Page<PersonDetails> findByExistFlagAndAddressDetailsAddressExistFlag(
String existFlag, String addressExistFlag, Pageable pageable);
}
@Bean
RepositoryItemReader<PersonDetails> personDetailsItemReader() {
Map<String, Sort.Direction> sort = new HashMap<>();
sort.put("ExistFlag", Sort.Direction.ASC);
return new RepositoryItemReaderBuilder<PersonDetails>()
.repository(personDetailsRepository)
.methodName("findByExistFlagAndAddressDetailsAddressExistFlag")
.arguments("Y", "Y")
.sorts(sort)
.name("personDetailsItemReader")
.build();
}