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

为什么我的仓库findAll()方法也返回子对象?

荀裕
2023-03-14

我有一个使用Spring JPA的Spring项目。我有一个BrandsProducts的表,我已经将它们映射到@ManyTo很多中,如下所示:

品牌实体:

@Entity
public class Brand{


@Id
@GeneratedValue(strategy = GenerationType.IDENTITY, generator = 
"brand_seq_gen")
@SequenceGenerator(name = "brand_seq_gen", sequenceName = "ISEQ$$_73370", allocationSize = 1)
@Column(name = "BRAND_ID")
private Long brandId;

@Column(name = "BRAND_NAME")
private String brandName;

@ManyToMany(fetch = FetchType.LAZY, cascade = {
    CascadeType.ALL
})
@JoinTable(
    name = "BRAND_PRODUCT",
    joinColumns = @JoinColumn(name = "BRAND_ID", referencedColumnName = "BRAND_ID"),
    inverseJoinColumns = @JoinColumn(name = "PRODUCT_ID", referencedColumnName = "PRODUCT_ID")
)
private Set<Product> products = new HashSet<>();    

 //CONSTRUCTORS, SETTERS, AND GETTERS
}

产品实体:

@Entity
public class Product{


@Id
@GeneratedValue(strategy = GenerationType.IDENTITY, generator = "prod_seq_gen")
@SequenceGenerator(name = "prod_seq_gen", sequenceName = "ISEQ$$_73373", allocationSize = 1)
@Column(name = "PRODUCT_ID")
private Long productId;

@Column(name = "TYPE_DESCRIPTION")
private String typeDescription;

public Product() {
}

@ManyToMany(mappedBy = "products", fetch = FetchType.LAZY)
private Set<Brand> brands = new HashSet<>();
//Setters, Getters, and Constructors

例如,我只想获取品牌的信息仅获取(品牌标识和品牌名称),而不获取产品,我如何仅获取品牌信息?非常感谢。

编辑1

我想访问所有品牌,但不访问每个品牌的产品。可能吗?还是我要创建另一个类?

--编辑2--

下面是使用BrandRepository时的一个示例查询。findall()

[ {
 "brandId" : 1,
  "brandName" : "Electrolux",
  "products" : [ {
    "productId" : 4,
    "typeDescription" : "Refrigerator"
  }, {
    "productId" : 3,
    "typeDescription" : "Washing Machine"
  } ]
}, {
  "brandId" : 2,
  "brandName" : "Midea",
  "products" : [ {
    "productId" : 4,
    "typeDescription" : "Refrigerator"
  }, {
    "productId" : 2,
    "typeDescription" : "Air Conditioner"
  }, {
    "productId" : 3,
    "typeDescription" : "Washing Machine"
  } ]
}, {
  "brandId" : 3,
  "brandName" : "Samsung",
  "products" : [ {
    "productId" : 1,
    "typeDescription" : "TV"
  }, {
    "productId" : 4,
    "typeDescription" : "Refrigerator"
  } ]
}, {
  "brandId" : 4,
  "brandName" : "LG",
  "products" : [ {
    "productId" : 1,
    "typeDescription" : "TV"
  } ]
} ]

我想要的应该是brandIdbrandName列,而不是@manytomy关系产生的产品。

--编辑4——我通过日志记录发现数据库被查询了两次,以检索两个表,这就是为什么我认为只使用@Query和一个投影可能更好的原因。


共有3个答案

卫景明
2023-03-14

获取某些实体属性的最简单方法是使用投影

回到您的示例,您可以像这样定义投影接口:

interface BrandNameAndId {
  Long getId();
  String getBrandName();
}

在你的品牌存储库中有这样一种方法:

List<BrandNameAndId > findAllProjectedBy();
羊越
2023-03-14

一定要有Spring。jpa。在应用程序中打开视图=错误。属性文件。如果将其设置为true,则在对实体调用get方法时,最终将查询数据库。

空夕
2023-03-14

使用hibernate延迟加载,只获取品牌,而不获取子项(产品)。

请看一下这篇文章,了解延迟加载的含义。

 类似资料:
  • 我有一个Spring Boot应用程序连接到本地mongoDB数据库。当我试图从集合中获取所有记录时,它返回一个空数组。在输出中,它表示已连接到端口27017。它在运行应用程序时不会给我任何错误,但在我键入时只返回一个空数组http://localhost:8080/courses/我错过了什么? 模范班 控制器类 存储库类 MongoDb输出

  • 问题内容: 我有一个LinearLayout,此LinearLayout将容纳动态放置的视图。我需要找出LinearLayout子级的宽度,但是必须在onCreate方法中完成。通过研究,我发现您不能通过此方法使用getWidth。因此,我改为使用onWindowFocusChanged,它适用于父级LinearLayout(向我返回实际大小),但不适用于其子级。 我注意到的另一件事是,当屏幕逐渐

  • 本文向大家介绍jQuery.fn的init方法返回的this指的是什么对象?为什么要返回this?相关面试题,主要包含被问及jQuery.fn的init方法返回的this指的是什么对象?为什么要返回this?时的应答技巧和注意事项,需要的朋友参考一下 [jQuery] jQuery.fn的init方法返回的this指的是什么对象?为什么要返回this?

  • 这是我的代码: 因为我使用POM设计模式,所以我为此创建了一种方法: 这是超文本标记语言标签: 我的问题是,即使存在WebElement,isDisplayed()也返回false。

  • 我在新的spring boot应用程序中遇到了一个奇怪的缓慢现象,当我获取一个表用于报告时。 这是一个简单的表,没有对其他表的引用,它有5列。行数为50k。因此,我使用了简单的findAll()方法,该方法在JpaRepository中提供。 当“目标”结果是实体时,findAll()执行需要5分钟。当我设置DTO类投影或接口投影时,执行需要1-2分钟。 我相信对于那么多的数据来说,这仍然太多了。

  • 问题内容: 由于在Java中使用了泛型,我最终不得不实现一个具有as返回类型的函数: 并且编译器要求我返回 一些东西 。现在我只是返回,但是我想知道这是否是好的编码实践… 我问的是 V oid,而不是 V oid。类, 而不是 保留关键字。 我也试过,,,,没有回报可言,但都不会在所有的工作。(出于或多或少明显的原因) 那么,如果函数的返回类型为,我应该返回什么呢? 该课程的一般用途是什么? 问题