当前位置: 首页 > 知识库问答 >
问题:

Spring:如何在默认情况下使用CrudRepository返回具有实体联合引用的所有对象

乜飞航
2023-03-14

我有一个产品表

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Entity
public class Product extends AuditModel {

    @Id
    @SequenceGenerator(name="optimized-sequence",sequenceName = "seq_product")
    private Integer id;
    private String sku;
    private String description;
    @NotNull
    private String name;

    *** 
    ***
    ***   

    @ManyToOne(optional = true)
    @JoinColumn(name = "category_id")
    @OnDelete(action = OnDeleteAction.NO_ACTION)
    private Category category;

    @ManyToOne(optional = true)
    @JoinColumn(name = "manufacturer_id")
    @OnDelete(action = OnDeleteAction.NO_ACTION)
    private Manufacturer manufacturer;

    @OneToMany(mappedBy = "product")
    private List<OrderProduct> orderProducts;

}

还有一个积垢积存器

public interface ProductRepository extends PagingAndSortingRepository<Product, Integer> {

    Product findFirstBydescription(@Param("description")String description);

}

当我调用endpoint /products默认情况下,我得到了所有产品的列表

{
  "_embedded" : {
    "products" : [ {
      "createdAt" : "2019-11-15T08:56:23.393+0000",
      "updatedAt" : "2019-11-15T08:56:23.393+0000",
      "id" : 802,
      "sku" : null,
      "name" : " product 1",
      "description" : "description one",
      "_links" : {
        "self" : {
          "href" : "http://localhost:8080/api/products/802"
        },
        "product" : {
          "href" : "http://localhost:8080/api/products/802{?projection}",
          "templated" : true
        },
        "manufacturer" : {
          "href" : "http://localhost:8080/api/products/802/manufacturer"
        },
        "orderProducts" : {
          "href" : "http://localhost:8080/api/products/802/orderProducts"
        },
        "category" : {
          "href" : "http://localhost:8080/api/products/802/category"
        }
      }
    }, .......

我怎么能得到,调用默认endpoint /products,内部的json对象产品的相关对象太(Catefory,制造商...)?

谢啦

共有3个答案

葛深
2023-03-14

使用Spring Data Rest是不可能的

您的问题不是很清楚,但从我所看到的来看,我假设您使用Spring Data Rest来公开您的数据。

正如回答中所说

Spring Data REST使用Spring HATEOAS自动公开Spring数据存储库管理的实体的资源,并利用超媒体特性进行分页、链接实体等。

问题是,HATEOAS背后的主要概念之一是发现机制。这意味着使用HATEOAS API,您将无法对您的资源进行“懒惰的阐述”,这违背了HATEOAS的理念。

这就是为什么我认为如果您真的想要相关对象,您应该避免Spring Data Rest,它不适合您的需求。

相反,您可以制作自己的控制器。您将失去Spring Data Rest提供的功能,每个实体都已经实现了CRUD操作。但是,您将对数据具有更大的灵活性,并且能够使用JSON响应中相关的实体公开数据。

羊新翰
2023-03-14

您可能希望使用FETCH JOIN重写查询:

@Query("SELECT p FROM Product p JOIN FETCH p.category JOIN FETCH p.manufacturer JOIN FETCH p.orderProducts WHERE p.description = :description")
Product findFirstByDescription(@Param("description") String description);

它将热切吸引产品的联想。

请注意,在这种情况下,您应该使您的关联延迟获取(即将关联注释的fetch参数设置为EAGER)。

祁凯泽
2023-03-14

如果我理解正确,您应该使用FetchType。@ManyToOne或@OneToOne注释中的渴望策略,用于从数据库中获取所有相关数据。

@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "category_id")
@OnDelete(action = OnDeleteAction.NO_ACTION)
private Category category;

@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "manufacturer_id")
@OnDelete(action = OnDeleteAction.NO_ACTION)
private Manufacturer manufacturer;

@OneToMany(mappedBy = "product", fetch = FetchType.EAGER)
private List<OrderProduct> orderProducts;
 类似资料:
  • 问题内容: 我知道我可以用来将字符串字段设置为 特定新索引中的新字段 。 有没有办法将此设置 全局 应用-即为任何新索引中的任何字符串字段设置属性?(无需为每个新索引设置它) 问题答案: 是的,你可以通过创建一个实现这个指标模板上有一个映射类型和动态模板 然后,您可以在任何新索引中创建任何文档,并且所有字符串字段都将为 如果检查新创建的映射类型,则将看到该字段为

  • 我正在使用一个PHP库将一个文件上传到我的bucket中。我已经将ACL设置为public read write,它可以正常工作,但文件仍然是私有的。 我发现如果我把被授权人改成所有人,文件就会公开。我想知道的是,如何将bucket中所有对象的默认grante设置为“Everyone”。或者有没有另一种默认公开文件的解决方案? 我使用的代码如下:

  • 为什么引用类型对象o无法访问变量a。它显示错误a无法解决或不是字段。

  • 问题内容: 我在整个应用程序中都使用spring 。现在,我也想为一个没有的创建一个。那有可能吗? 问题答案: JPA要求每个实体都有一个ID。因此,不可以,没有ID的实体是不允许的。 每个JPA实体都必须有一个主键。 从JPA规范 您可能想从这里阅读更多有关JPA如何处理数据库端没有ID的情况的信息(请参阅“无主键”)。

  • 问题内容: 我已经创建了这个并且尝试使用实体框架来调用它。下面是用C#编写的代码。 在所有情况下都返回。请让我知道错误。 编辑 -根据给定的答案,不使用存储过程的return语句,因为Entity Framework不支持开箱即用的存储过程返回标量值。让我知道如何从中发送标量数据? 问题答案: 您的存储过程当前返回 标 量值。使用以下步骤来解决此问题: 像这样更改您的存储过程(不要在存储过程中使用

  • 问题内容: 我对Hibernate真的很陌生。我想要使用hibernate条件,但只填充了用户ID和名称字段。那可能吗?如下所示的查询: 问候。 问题答案: 这正是预测的目的。这是一个例子: 实际上,如果您查看“惰性属性提取”文档,他们会特别说: “至少对于只读事务,避免不必要的列读取的另一种(更好的)方法是使用HQL或Criteria查询的投影功能。这避免了对构建时字节码处理的需求,并且肯定是首