Java Spring:如何使用crudepository返回默认情况下具有实体关联引用的所有对象

Java Spring:如何使用crudepository返回默认情况下具有实体关联引用的所有对象,java,json,spring,hibernate,Java,Json,Spring,Hibernate,我有一张产品表 @Getter @Setter @NoArgsConstructor @AllArgsConstructor @Entity public class Product extends AuditModel { @Id @SequenceGenerator(name="optimized-sequence",sequenceName = "seq_product") private Integer id; private String sku;

我有一张产品表

@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;

}
调用默认端点/产品,如何在json对象产品中也获取相关对象(Catefory、Manufacturer


谢谢

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

@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;
@ManyToOne(fetch=FetchType.EAGER)
@JoinColumn(name=“category\u id”)
@OnDelete(action=OnDeleteAction.NO\u action)
私人类别;
@manytone(fetch=FetchType.EAGER)
@JoinColumn(name=“制造商id”)
@OnDelete(action=OnDeleteAction.NO\u action)
私营制造商;
@OneToMany(mappedBy=“product”,fetch=FetchType.EAGER)
私人列表订购产品;

您可能希望使用以下命令重写查询:

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


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

使用Spring数据Rest是不可能的

您的问题不太清楚,但据我所见,我假设您使用
Spring Data Rest
来公开数据

如中所说

Spring数据REST
使用
Spring HATEOAS
自动公开 Spring数据存储库和 利用超媒体特性进行分页、链接实体等

问题是,HATEOAS背后的一个主要概念是。这意味着使用HATEOAS API,您将不可能对您的资源进行“懒散的阐述”,这违反了HATEOAS的理念

这就是为什么我认为如果你真的想要相关的对象,你应该避免使用
Spring数据Rest
,它不适合你的需要


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

我不理解您的问题
Spring jpa使用实体管理器创建查询,如果查询是由实体管理器生成的,则Hibernate将忽略获取模式。
@oguzhan00Sorry但不是该查询。我想获取Crudepository默认公开的默认endponint/产品中的所有相关对象
{
  "_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"
        }
      }
    }, .......
@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;
@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);