【问题标题】:How do I Write joins in spring boot我如何在 Spring Boot 中编写连接
【发布时间】:2021-07-18 03:22:46
【问题描述】:

我是spring boot 的初学者,我正在研究数据库实体。现在我需要在我的spring boot 项目中使用joins 从不同的表中获取数据。

我有 3 个表 itemcategoryissued_item,我写了一个 query 让它从中获取数据。

query 是:

SELECT issued_item.issued_id,
       item.item_name,
       issued_item.issued_from,
       issued_item.issued_to,
       issued_item.quantity,
       category.cat_type,
       issued_item.issued_date
FROM issued_item
INNER JOIN item ON issued_item.ii_fk = item.item_id
INNER JOIN category ON item.ic_fk = category.cat_id;

现在我很困惑如何在我的spring boot 项目上写它。

此外,将其提高到一些高级水平,我使用parameters 访问items,例如:

SELECT issued_item.issued_id,
       item.item_name,
       issued_item.issued_from,
       issued_item.issued_to,
       issued_item.quantity,
       category.cat_type,
       issued_item.issued_date
FROM issued_item
INNER JOIN item ON issued_item.ii_fk = item.item_id
INNER JOIN category ON item.ic_fk = category.cat_id
WHERE issued_item.issued_date BETWEEN FromDate AND ToDate
ORDER BY issued_item.issued_date ASC;

FromDateToDate 是两个不同的参数。


注意:如果有人需要实体代码,我会提供。

在这种情况下使用dto 类有用吗?

【问题讨论】:

  • 我宁愿使用 Spring Data Entity 类来定义使用 @OnetoMany@ManyToOne 的关系,这样您就不必在每个查询中都使用连接。
  • 这不会从子级向父级获取数据。

标签: java sql spring-boot


【解决方案1】:

如下所示,使用返回类型为List<Object []>

@Query(value="SELECT issued_item.issued_id, 
item.item_name, issued_item.issued_from, 
issued_item.issued_to, issued_item.quantity, category.cat_type, 
issued_item.issued_date
FROM issued_item
INNER JOIN item
ON issued_item.ii_fk = item.item_id
INNER JOIN category
ON item.ic_fk = category.cat_id
WHERE issued_item.issued_date BETWEEN :fromdate AND 
:todate
ORDER BY issued_item.issued_date ASC", nativeQuery= true)
List<Object []> returnObject(@Param("fromdate" Date fromdate, @Param("todate") Date todate );

然后迭代获取值。

for(Object[] obj : result) {
 String issueId = (String) obj[0];
 //Get others variable also
}

【讨论】:

  • 我在哪里可以传递参数值,即 ToDateFromDate
  • 立即查看答案
  • 现在它给了我SQLSyntaxErrorException 错误
  • 但是当我将它写在一行中时,它会给出另一个错误'item_id' not found
  • 查询应该是这样的; ` @Query(value = "SELECT i.issued_id, it.item_name, i.issued_from, i.issued_to, i.issued_quantity, c.cat_type, i.issued_date" + " FROM issue_item i" + " INNER JOIN item it" + " ON i.ii_fk = it.item_id" + " INNER JOIN category c" + " ON it.ic_fk = c.cat_id" + " ORDER BY i.issued_date ASC", nativeQuery = true) List fetchIssuedItems( );`
【解决方案2】:

实体类和存储库类应类似于如下所示。 OneToMany 和 ManyToOne 向 JPA 提供主键/外键信息以连接表。由于您的表字段名称不遵循典型的命名约定,因此必须通过 JoinColumn 显式命名它们。

一旦定义了实体,大多数查询将由 JPA 自动生成 - 您只需提供 JPA requires 格式的方法声明

@Entity
@Table(name="item")
class Item{
  @Identity
  private Long item_id;

  ....other columns

  @OneToMany(fetch = FetchType.EAGER)
  private List<IssuedItem> issuedItems;

  @ManyToOne
  @JoinColumn(name="ic_fk")
  private Category category;
}

@Entity
@Table(name="category")
class Category{
  @Identity
  private Long cat_id;

  @OneToMany(fetch = FetchType.EAGER)
  private List<Item> items;

  ....other columns

  
}

@Entity
@Table(name="issued_item")
class IssuedItem{

  ....other columns

  
  @ManyToOne(fetch = FetchType.EAGER)
  @JoinColumn(name="ii_fk")
  private Item item;
}


@Repository
class IssuedItemRepository extends JpaRepository<IssuedItem, Long>{
  //implementation will be generated by JPA
  List<IssuedItem> findAllByIssuedDateBetween(
      Date FromDate,
      Date ToDate);
}

@Repository
class ItemRepository extends JpaRepository<Item, Long>{
}

@Repository
class CategoryRepository extends JpaRepository<Category, Long>{
}

【讨论】:

  • 这是一个赞赏的答案,但在这里我只得到 issued_item 相关字段。不是 Item 实体相关的字段。我在本机查询中提到了 (i.e. category.cat_type and item.item_name).
猜你喜欢
  • 2015-06-05
  • 2019-08-23
  • 1970-01-01
  • 2018-10-24
  • 2019-08-10
  • 2021-04-03
  • 2020-07-12
  • 1970-01-01
  • 2018-09-04
相关资源
最近更新 更多