Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring Boot中的标准API_Java_Spring_Spring Boot_Jpa_Spring Data Jpa - Fatal编程技术网

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教程: