【发布时间】:2021-12-01 19:17:13
【问题描述】:
我正在尝试使用JOIN 查询特定productType 和Sizes(两个差异表中的列)从所有下表中获取数据。
我无法得到想要的结果,所以一些指导会很有帮助。
请在下面找到我到目前为止所尝试的详细信息。
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 我需要从所有表中获取数据。
注意:尺寸不是表 MC_Product_Type 的一部分。数据团队已告知,如果他们在此表中包含尺寸,这将是冗余数据。所以尺寸是MC_Size_Rules 表的一部分。
我试图在前两个查询中动态传递 prod_type 和 size,但仅获得 size 'XS' 的结果,这是表 MC_Size_Rules 中第一行的值,即使我传递了其他 size 值。
在第三个查询中,我收到异常说 size 不是 ProductType 的一部分。
当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 中未定义尺寸
【问题讨论】:
标签: java postgresql spring-boot jpa spring-data-jpa