![](/img/trans.png)
[英]How to fetch data from multiple tables in spring boot using mapping in Spring Boot's JPA repository
[英]Fetch Results from All tables in SpringBoot JPA Repository
我正在尝试使用特定productType
和Sizes
(两个差异表中的列)的JOIN
查询从所有下表中获取数据。
我无法获得所需的结果,因此一些指导将非常有帮助。
请在下面找到我迄今为止尝试过的详细信息。
PK:主键,FK:外键。
以下是带有表(提到)的表结构,其中OneToOne
映射到另一个表。
**MC_Product_Type**:
prod_type_id (PK),
prod_type,
description
|
|OnetoOne
|
**MC_Set_Rules**:
set_id (PK),
prod_type_id (FK),
set_name,
set_type,
condition
|
|OneToOne
|
**MC_Size_Rules**:
prod_rule_id (PK),
prod_type,
Sizes,
set_id (FK),
min_qty,
dimension
|
|OneToOne
|
**MC_Product_Rules**:
prod_rule_id (FK),
prod_type,
allowed_type,
availability,
prod_label,
locations
实体类:
@Table(name = "MC_Product_Type")
@Entity
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Getter
@Setter
@ApiModel
@JsonInclude(JsonInclude.Include.NON_NULL)
public class ProductType {
@Id
private int prodTypeId;
private String prodType;
private String description;
@OneToOne
@JoinColumn(name="prodTypeId", referencedColumnName="prodTypeId", insertable=false, updatable=false)
private SetRules setRules;
}
@Table(name = "MC_Set_Rules")
@Entity
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Getter
@Setter
public class SetRules {
@Id
private int setId;
private int prodTypeId;
private String setName;
private String setType;
private String condition;
@OneToOne
@JoinColumn(name="setId", referencedColumnName="setId", insertable=false, updatable=false)
private SizeRulesEntity sizeRules;
}
@Table(name = "MC_Size_Rules")
@Entity
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Getter
@Setter
public class SizeRulesEntity {
@Id
private int prodRuleId;
private String prodType;
private String sizes;
private int setId;
private int minQty;
private String dimension;
@OneToOne
@JoinColumn(name="prodRuleId", referencedColumnName="prodRuleId", insertable=false, updatable=false)
private ProductRules productRules;
}
@Table(name = "MC_Product_Rules")
@Entity
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Getter
@Setter
public class ProductRules {
@Id
private int prodRuleId;
private String prodType;
private String allowedType;
private String availability;
private String prodLabel;
private String locations;
}.
存储库:
Value for prod_type = "ELLACUST"
Value for Sizes = "XS","S","M","L","XL"
我使用了以下查询(一个接一个),基于 prod_type 和 Size 我需要从所有表中获取数据。
注意:Sizes 不是表MC_Product_Type
一部分。 数据团队已告知,如果他们在此表中包含大小,这将是一个冗余数据。 所以尺寸是MC_Size_Rules
表的一部分。
我试图在前两个查询中动态传递 prod_type 和大小,但仅获取大小“XS”的结果,即使我传递其他大小值,它也是表MC_Size_Rules
第一行的值。
在第三个查询中,我收到异常说尺寸不是ProductType
一部分。
我需要关于在传递prod_type
和正确大小时应该在实体类、映射或查询中更改哪些内容以从所有表中获取数据的prod_type
。
public interface ProductRulesRepository extends JpaRepository <ProductType, String> {
@Query("SELECT pt FROM ProductType pt JOIN pt.setRules s ON pt.prodTypeId = s.prodTypeId JOIN s.sizeRules sr ON s.setId = sr.setId JOIN sr.productRules pr ON sr.prodRuleId = pr.prodRuleId where pt.prodType = :prodType AND pt.setRules.sizeRules.sizes = :sizes")
ProductType findAllByProdTypeAndSizes(String prodType, String sizes);
@Query("SELECT pt FROM ProductType pt JOIN pt.setRules s ON pt.prodTypeId = s.prodTypeId JOIN s.sizeRules sr ON s.setId = sr.setId JOIN sr.productRules pr ON sr.prodRuleId = pr.prodRuleId where pt.prodType = ?1 AND pt.setRules.sizeRules.sizes = ?2"))
@Query("SELECT pt FROM ProductType pt JOIN pt.setRules s ON pt.prodTypeId = s.prodTypeId JOIN s.sizeRules sr ON s.setId = sr.setId JOIN sr.productRules pr ON sr.prodRuleId = pr.prodRuleId")
ProductType findAllByProdTypeAndSizes(String prodType, String sizes);
异常:尺寸未在 ProductType 中定义
首先,您误用了@Query
注释,您的变量插值是错误的 cf " ?2
您应该像这样使用它
@Query("select from User u where u.id = :id")
findUserById(@Param("id") String id)
第二:你的方法的返回类型是错误的,你选择了多行,所以你的重运行类型应该是一个集合
第三:Spring 为您提供了一个名为 Spring 的命名查询功能。 它允许 spring 从方法的名称中猜测关联的 sql
最后你可以尝试这样的事情
Collection<ProductType> findByProdTypeAndSizeRulesSizes(String prodType, String sizes);
hibernate orm 将为您处理相关对象中的关联数据(@OneToOne 关系)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.