【问题标题】:Spring Data Jpa One To One mapping with where clauseSpring Data Jpa 与 where 子句的一对一映射
【发布时间】:2020-07-10 12:47:44
【问题描述】:

我有两个表,我需要使用 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'

表 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;
}

表 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 批量读取存储库获取数据,则只考虑存在标志 = '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();
}

【问题讨论】:

    标签: spring-boot spring-data-jpa spring-batch


    【解决方案1】:

    您只是在查询 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(clause = "addressExistFlag = 'Y'")
    • 我不明白?
    • 我的意思是说,在使用 OneToOne 映射从 DB 中提取数据时,不会使用下面提到的实体类中的 where 子句。 @OneToOne(mappedBy = "personDetails", cascade = CascadeType.ALL) @Where(clause = "addressExistFlag = 'Y'") private AddressDetails addressDetails;
    • 这将用于限制集合的内容但与查询无关
    • 如果我调用 PersonDetailsRepository.findAll() 会变成图片吗
    猜你喜欢
    • 1970-01-01
    • 2019-11-15
    • 2021-09-15
    • 2020-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-18
    相关资源
    最近更新 更多