【问题标题】:Fetch Results from All tables in SpringBoot JPA Repository从 Spring Boot JPA 存储库中的所有表中获取结果
【发布时间】:2021-12-01 19:17:13
【问题描述】:

我正在尝试使用JOIN 查询特定productTypeSizes(两个差异表中的列)从所有下表中获取数据。
我无法得到想要的结果,所以一些指导会很有帮助。

请在下面找到我到目前为止所尝试的详细信息。

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


    【解决方案1】:

    首先你滥用@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 关系)

    【讨论】:

      猜你喜欢
      • 2021-11-07
      • 2022-01-09
      • 2018-03-09
      • 2018-08-06
      • 2018-01-04
      • 1970-01-01
      • 2021-04-16
      • 2015-12-15
      • 1970-01-01
      相关资源
      最近更新 更多