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

从SpringBoot JPA存储库中的所有表中获取结果

郤浩慨
2023-03-14

我试图使用查询特定的产品类型和大小(两个diff表中的列),从以下所有表中获取数据<我无法得到想要的结果,所以一些指导将非常有用。

请在下面找到我迄今为止尝试过的细节。

PK:主键,FK:外键
以下是表结构,下面的表(提到)映射到另一个表。

**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_类型和大小,我需要从所有表中获取数据。

注:尺寸不是表MC\U产品类型的一部分。数据团队已告知,如果他们在该表中包含尺寸,则这将是一个冗余数据。因此,尺寸是MC\u Size\u规则表的一部分。

我试图在前两个查询中动态传递prod\u type和size,但只得到size“XS”的结果,这是表MC\u size\u规则中第一行的值,即使我传递了其他size值。

在第三个查询中,我得到了一个异常,即尺寸不是产品类型的一部分。

当传递了正确的大小时,我需要帮助了解我应该在实体类、映射或查询中更改什么以从所有表中获取数据。

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中未定义尺寸

共有1个答案

壤驷英叡
2023-03-14

首先你误用了@Query注释你的变量插值是错误的cf"?2你应该这样使用它

@Query("select from User u where u.id = :id")
findUserById(@Param("id") String id)

第二:你的方法的返回类型是错误的,你选择了多行,所以你的retrun类型应该是一个集合

第三:Spring为您提供了一个称为Spring命名查询的功能。它允许spring根据方法的名称猜测相关的sql

最后你可以试试这样的

 Collection<ProductType> findByProdTypeAndSizeRulesSizes(String prodType, String sizes);

Hibernate orm将为您处理相关对象中关联数据的获取(@OneToOne关系)

 类似资料:
  • 问题内容: 我正在尝试运行一个容器,该容器将公开私有GitHub存储库上的软件包中的golang服务。 由于我与GCE合作,因此我的入门图片是google / debian:wheezy。 安装所有必需的依赖项和工具后,我正在运行 包裹是私人仓库。 我添加了GitHub SSH密钥以允许从私有存储库克隆到docker文件: 尽管如此,当go尝试克隆存储库时,我在go get流程中遇到了一个错误:

  • 下面是我得到的控制台输出和错误: 下面是我按下Get Images按钮后的控制台输出,您可以看到图像的url为:

  • 我不熟悉使用CRUD存储库。 我有一个包含三列的数据库表: course_id,姓名,当然 我想得到一份course\u id name的列表,例如, 但是,我不想使用查询,而是使用crud存储库。 我的控制器显示有错误。我可以知道有这个错误吗? 我的控制器 服务 存储库

  • 有没有办法从Firebase存储中获取所有的URL? 我知道有从firebase数据库获取URL的方法,比如将firebase存储文件的URL存储在firebase实时数据库中,然后从它获取URL。但是我正在从图片中显示的按钮上传图片,并且想要所有那些上传图片的URL直接从firebase存储路径像... 用它就像... 如有任何帮助,我们将不胜感激。

  • 问题内容: 我只是不明白一件事。当我输入时: 我得到: 但是选择似乎根本不起作用: 那怎么可能?我的意思是,表明存在一个名为“ db”的表… 其次,当我键入:它给我: 我能够做到: 我得到了一些结果。这是为什么?为什么我只能选择大写字母呢?而且,如何从仅以大写形式给出的表中进行选择?干杯 如果很重要:我以root用户身份登录到我的数据库。 问题答案: “ information_schema”仅具