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