Spring Data JPA按示例查找所有嵌套集合属性。

4

我有两个对象。公司可以拥有多个嵌套地址。

@Entity
@Data
@Table(name = "company")
public class Company {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id")
    private Long id;

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

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

    @OneToMany(mappedBy = "company", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY)
    private List<Address> addresses;
}

Address类看起来像这样:

@Data
@Entity
@Table(name = "address")
@ToString(exclude = "company")
public class Address {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id")
    private Long id;

    @Column(name = "postal_code")
    private String postalCode;

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

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

    @JsonIgnore
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "company_id")
    private Company company;
}

如果可能的话,我希望能够创建一个动态查询来搜索嵌套集合属性。我已经创建了一个使用示例匹配器的搜索方法,但结果是错误的。每次我从数据库获得所有内容,而不仅仅是我正在查找的有地址邮政编码的公司。

我的搜索方法如下:

@PostMapping("/search")
    public List<Company> search(@RequestBody final Company company){
        return companyRepository.findAll(Example.of(company,
                ExampleMatcher.matchingAny()
                        .withIgnoreNullValues()
                        .withIgnorePaths("id")
                        .withStringMatcher(ExampleMatcher.StringMatcher.STARTING)));
    }

在我的数据库中,有两个对象,以下是搜索结果:enter image description here。从结果可以看出,我收到了来自数据库的所有内容,而不仅仅是地址邮政编码以1开头的第一家公司。
1个回答

1

你好,你可以使用 Specification<T>

https://spring.io/blog/2011/04/26/advanced-spring-data-jpa-specifications-and-querydsl/

为此,您需要从接口JpaSpecificationExecutor进行扩展:

public interface UserRepository extends JpaRepository<User> ,JpaSpecificationExecutor<User>{
}

您还需要实现自定义的Specification<T>

然后您可以使用repository.findAll(your implemented Specification);

Spring文档:

https://docs.spring.io/spring-data/jpa/docs/current/api/org/springframework/data/jpa/repository/JpaSpecificationExecutor.html

我认为这很有帮助。


谢谢。我考虑过了,这是解决这个问题的一个选项。另一个选项是查询DSL。但我想知道是否可能用QBE解决它。 - Matija Župančić
你可以创建一个客户实体,将其填充到List<Adresses>中,并创建此类客户实体的示例,然后尝试使用findAll()等方法。这是一个有用的链接: https://kalliphant.com/spring-data-jpa-querybyexample-tutorial/ - Mykhailo Moskura

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接