我正在使用JPA使用Spring Boot开发应用程序。
在应用程序中,我将公开一个REST API。我不想使用Spring数据休息,因为我想完全控制数据。

我无法弄清楚如何动态使用EntityGraph。

假设我从here中获取了以下模型

   @Entity
class Product {

  @ManyToMany
  Set<Tag> tags;

  // other properties omitted
}

interface ProductRepository extends Repository<Customer, Long> {

  @EntityGraph(attributePaths = {"tags"})
  Product findOneById(Long id);
}

我有以下休息链接访问产品
http://localhost:8090/product/1

它向我返回ID为1的产品

问题:
  • 默认情况下,是否会像我们提到@EntityGraph那样获取标签
    如果是,那么可以按需配置吗?说,如果在查询中
    我有 include = tags 的字符串,那么只有我想用
    它的标签。

  • 我找到了this文章,但不确定如何提供帮助。

    最佳答案

    Spring Data JPA存储库中的EntityGraph定义是静态的。如果要使其动态化,则需要像链接到的页面那样以编程方式进行此操作:

    EntityGraph<Product> graph = this.em.createEntityGraph(Product.class);
    graph.addAttributeNodes("tags"); //here you can add or not the tags
    
    Map<String, Object> hints = new HashMap<String, Object>();
    hints.put("javax.persistence.loadgraph", graph);
    
    this.em.find(Product.class, orderId, hints);
    

    您还可以在JPA存储库中使用EntityGraph定义方法。
    interface ProductRepository extends Repository<Product, Long> {
    
    @EntityGraph(attributePaths = {"tags"})
    @Query("SELECT p FROM Product p WHERE p.id=:id")
    Product findOneByIdWithEntityGraphTags(@Param("id") Long id);
    }
    

    然后在您的服务中有一个方法,该方法将该方法与EntityGraph或内置的findOne(T id)一起使用,而没有EntityGraph:
    Product findOneById(Long id, boolean withTags){
      if(withTags){
        return productRepository.findOneByIdWithEntityGraphTags(id);
      } else {
        return productRepository.findOne(id);
      }
    }
    

    09-11 18:35