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

仅从Spring Data JPA中的联接表(多对多)中选择特定列

管和志
2023-03-14

其目的是从联接的表(多对多)中选择列。
我遇到的问题是从联接的多对多表中选择两列。

我使用的是SpringBoot2.3和Spring data JPA。

我有这个数据模型,我想要获取的是蓝色装箱的字段

SELECT bg.id, bg.name, p.name, c.name, c.short_desc FROM boardgame as bg 
 JOIN boardgame_category bgc on bg.id = bgc.fk_game 
 JOIN publisher p on bg.fk_publisher = p.id 
 JOIN category c on bgc.fk_category = c.id 
 WHERE bg.id = :id 
public class BoardgameDto {

    private long id;

    private String name;

    private String publisherName;

    private Set<CatregoryDto> categoryDto;

    // setter, getter etc...
}

public class CategoryDto {

    private String name;

    private String shortDesc;

    // setter, getter etc...
}

/* THIS DOESN'T WORK */
SELECT new org.moto.tryingstuff.dto.BoardgameDto(bg.id, bg.name, p.name, 
new org.moto.tryingstuff.dto.CategoryDto(c.name, c.short_desc)) FROM Boardgame as bg, Publisher as p, Category as c
public interface BoardgameRepository extends JpaRepository<Boardgame, Long> {
}

// In a test or service method
Boardgame game = repository.findById(long id);

共有1个答案

岳阳文
2023-03-14

正如您所写的,不能使用集合作为构造函数表达式的参数。这是因为表达式应用于结果集中的每个记录。这些记录是一个扁平的数据结构。它们不包含任何集合。您的数据库将为该集合中的每个元素返回一条新记录。

但是您的构造函数表达式由于不同的原因而失败。您试图组合2个构造函数表达式,但这不受支持。您需要删除第二个表达式,并在DTO的构造函数中执行该操作。

因此,您的查询应该如下所示:

SELECT new org.moto.tryingstuff.dto.BoardgameDto(bg.id, bg.name, p.name, c.name, c.short_desc) FROM Boardgame as bg <Your JOIN CLAUSES HERE>
public class BoardgameDto {

  public BoardgameDto(Long id, String gameName, String publisherName, String categoryName, String description) {
     this.id = id;
     this.name = gameName;
     this.publisherName = publisherName;
     this.category = new Category(categoryName, description);
  }

  ...
}
 类似资料:
  • 我需要发票,invoice_details表的所有列,但我想从我的付款表中只得到一列(列名:)。我对它有什么疑问?这是我的控制器。

  • 问题内容: 如何选择多个表并从同一列联接多个行? 它不会返回,并且。我确定此SQL代码段的语法错误。 更新: 显示。移除后 它返回: 但我需要退货: 问题答案: 您可以多次连接到同一张表,而只需提供不同的别名

  • 我有两张桌子,客户和订单是内部连接的。客户可以有多个与其关联的订单。在我的选择中,我然后按客户分组。id.我需要选择每个客户的最新订单,还需要选择在该订单中花费的金额。目前,我可以选择最近的订单日期,但不知道如何选择与订单日期同一行中的金额。 这是我当前的查询: 查询选择最近日期,但不选择与最近订单日期关联的金额。 表格声明:

  • 问题内容: 我很好奇为什么需要使用,因为我们可以使用逗号选择多个表。 和使用逗号选择多个表之间有何区别? 哪一个更快? 这是我的代码: …和: 问题答案: 首先,要完全等同,应该已经编写了第一个查询 这样mw。和nvs。一起产生与第二个查询的单数*相同的集合。您编写的查询可以使用INNER JOIN,因为它包括对nvs.correct的过滤器。 一般形式 查找基于条件的TableB记录。如果失败,

  • 问题内容: 我想根据URL字符串选择一些ID,但对于我的代码,它仅显示第一个。如果我写手册的ID是伟大的。 我有这样的网址http://www.mydomain.com/myfile.php?theurl=1,2,3,4,5(ids) 现在在myfile.php中,我有sql连接,并且: 如果我使用这个: 我得到正确的结果。现在,如果我使用下面的代码,它将无法正常工作: 有什么建议? 问题答案:

  • 问题内容: 理想情况下,我需要一个等于 但这是非法的。 我不能使用自动递增的字段。 row_number()是需要选择的行。 我该怎么办? 编辑:嗯,我使用iSql * plus进行练习,出于某些原因,使用limit和auto_increment是非法的。我最终创建了一个序列和一个触发器,并且每次输入一个条目时,ID都增加了1。 问题答案: 您可以使用代替。 如文档所述, 第一个参数指定要返回的第