Java Spring Boot中的标准API
我有以下(简化的)实体结构:Java Spring Boot中的标准API,java,spring,spring-boot,jpa,spring-data-jpa,Java,Spring,Spring Boot,Jpa,Spring Data Jpa,我有以下(简化的)实体结构: 公共类动物{ 私人长id; 私有区域ID; 私有int类别; @OneToMany(fetch=FetchType.LAZY,cascade=CascadeType.ALL,mappedBy=“animal”) 私有列表属性; } 公共类属性{ 私人长id; @manytone(fetch=FetchType.LAZY) 私人动物; 私有字符串名称; 私有字符串值; @OneToOne(fetch=FetchType.LAZY,cascade=CascadeType
公共类动物{
私人长id;
私有区域ID;
私有int类别;
@OneToMany(fetch=FetchType.LAZY,cascade=CascadeType.ALL,mappedBy=“animal”)
私有列表属性;
}
公共类属性{
私人长id;
@manytone(fetch=FetchType.LAZY)
私人动物;
私有字符串名称;
私有字符串值;
@OneToOne(fetch=FetchType.LAZY,cascade=CascadeType.ALL)
私人细节;
}
公共类详细信息{
私人长id;
私有字符串大小;
私有字符串类型;
}
这是Spring引导应用程序的一部分
我想要实现的是通过动物自身的属性和细节中的属性查询动物
我的查询需要如下所示:
GET: /animal/{regionId}/{categoryId}?size=medium,large&type=carnivorous,herbivore
这意味着我需要请求所有具有特定regionId和categoryId且具有详细信息的动物,其大小和类型在提供的值列表内。另外——我认为这是一个棘手的部分——大小和类型参数是可选的,所以查询需要考虑到这一点
目前,我有一个PlanRepository,它扩展了Crudepository,并为Plan实体提供了基本的查询方法
我试图用CriteriaAPI来解决如何使用它来实现这一目标,但我不明白如何将所有这些都放在我的存储库中。有什么想法吗?您应该看看Spring数据JPA规范: 您必须从JpaSpecificationExecutor扩展存储库
public interface CustomerRepository
extends CrudRepository<Customer, Long>, JpaSpecificationExecutor {
…
}
公共接口CustomerRepository
扩展CRUDEPository,JpaSpecificationExecutor{
…
}
然后您需要一个findAll方法,该方法采用规范参数:
List<T> findAll(Specification<T> spec);
清单findAll(规范规范);
然后,您可以根据URL中传递的参数创建规范:
public static Specification<Animal> bySizeAndType(String size, String type) {
return new Specification<Animal>() {
public Predicate toPredicate(Root<Animal> root, CriteriaQuery<?> query,
CriteriaBuilder builder) {
// JOIN Attributes
// JOIN Detail
if (size != null) {
// add condition
}
if (type != null) {
// add condition
}
return builder.where(...);
}
};
}
公共静态规范bySizeAndType(字符串大小、字符串类型){
返回新规范(){
公共谓词toPredicate(根根、标准查询、,
标准生成器(生成器){
//连接属性
//连接细节
如果(大小!=null){
//附加条件
}
if(type!=null){
//附加条件
}
返回生成器。其中(…);
}
};
}
我希望这会有所帮助。您应该看看Spring数据JPA规范: 您必须从JpaSpecificationExecutor扩展存储库
public interface CustomerRepository
extends CrudRepository<Customer, Long>, JpaSpecificationExecutor {
…
}
公共接口CustomerRepository
扩展CRUDEPository,JpaSpecificationExecutor{
…
}
然后您需要一个findAll方法,该方法采用规范参数:
List<T> findAll(Specification<T> spec);
清单findAll(规范规范);
然后,您可以根据URL中传递的参数创建规范:
public static Specification<Animal> bySizeAndType(String size, String type) {
return new Specification<Animal>() {
public Predicate toPredicate(Root<Animal> root, CriteriaQuery<?> query,
CriteriaBuilder builder) {
// JOIN Attributes
// JOIN Detail
if (size != null) {
// add condition
}
if (type != null) {
// add condition
}
return builder.where(...);
}
};
}
公共静态规范bySizeAndType(字符串大小、字符串类型){
返回新规范(){
公共谓词toPredicate(根根、标准查询、,
标准生成器(生成器){
//连接属性
//连接细节
如果(大小!=null){
//附加条件
}
if(type!=null){
//附加条件
}
返回生成器。其中(…);
}
};
}
我希望这有帮助。好了,我开始明白了。在这种情况下,连接和条件是什么样子的?您应该买本书或阅读JavaEE教程:好的,我开始看到图片了。在这种情况下,连接和条件是什么样子的?您应该买本书或阅读Java EE教程: