繁体   English   中英

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

[英]Fetch Results from All tables in SpringBoot JPA Repository

我正在尝试使用特定productTypeSizes (两个差异表中的列)的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 关系)

列表中的 findBy 属性<object> SpringBoot JPA 存储库<div id="text_translate"><p>我的数据库 Story 和 Tag 中的两个对象之间存在一对多关系。</p><p> 我希望能够获取所有带有标签 object 和字符串名称的 Story 对象。</p><p> 故事.java</p><pre> @Entity @Table(name = "stories") public class Story { @Id @GeneratedValue private Long id; @Column(name = "title") private String title; @JsonIgnoreProperties({"story"}) @OneToMany(mappedBy = "story", fetch = FetchType.LAZY) private List&lt;Tag&gt; tags; public Story(String title){ this.title = title; } public Story(){ } // getters &amp; setters }</pre><p> 标签.java</p><pre> @Entity @Table(name = "tags") public class Tag { @Id @GeneratedValue private Long id; @Column(name = "name") private String name; @JsonIgnoreProperties({"tags"}) @ManyToOne @JoinColumn(name = "story_id", nullable = false) @Cascade(org.hibernate.annotations.CascadeType.SAVE_UPDATE) private Story story; public Tag(String name, Story story){ this.name = name; this.story = story; } public Tag(){ } /// getters &amp; setters }</pre><p> StoryController.java</p><pre> @RestController public class StoryController { @Autowired StoryRepository storyRepository; @CrossOrigin(origins = "http://localhost:8080/api") @GetMapping(value = "/stories") public ResponseEntity&lt;List&lt;Story&gt;&gt; getAllStories(){ return new ResponseEntity&lt;&gt;(storyRepository.findAll(), HttpStatus.OK); } @CrossOrigin(origins = "http://localhost:8080/api") @GetMapping(value="/stories/tagSearch/{name}") public ResponseEntity&lt;Story&gt; getStoryByTag(@PathVariable String name) { return new ResponseEntity(storyRepository.findByTags_Name(name), HttpStatus.OK); } @CrossOrigin(origins = "http://localhost:8080/api") @GetMapping(value="/stories/{id}") public ResponseEntity&lt;Story&gt; getStory(@PathVariable Long id) { return new ResponseEntity(storyRepository.findById(id), HttpStatus.OK); } }</pre><p> StoryRepository.java</p><pre> @Repository public interface StoryRepository extends JpaRepository&lt;Story, Long&gt; { public List&lt;Story&gt; findByTags_Name(String name); }</pre><p> 尝试通过浏览器查询时,转到地址 localhost:8080/api/stories/tagSearch/?name="tag" 数据库返回数据库中的所有对象,而不是我要查找的结果。</p></div></object>

[英]findBy property in List<Object> SpringBoot JPA Repository

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何使用 Spring Boot 的 JPA 存储库中的映射从 spring 引导中的多个表中获取数据 从 JPA 存储库获取期间出现 ArrayIndexOutOfBoundsException 无法从 SpringBoot Main 方法保存 JPA Repository 变量的方法 如何在 Spring JPA 存储库中加入多个表的结果 如何从JPA中的两个表中获取数据 通过从两个表中查询在 SpringBoot 中获取数据的最佳方法 如何为 Springboot JPA 拥有一个通用的通用存储库 用于数据库视图(不是表)的 JPA/SpringBoot 存储库 列表中的 findBy 属性<object> SpringBoot JPA 存储库<div id="text_translate"><p>我的数据库 Story 和 Tag 中的两个对象之间存在一对多关系。</p><p> 我希望能够获取所有带有标签 object 和字符串名称的 Story 对象。</p><p> 故事.java</p><pre> @Entity @Table(name = "stories") public class Story { @Id @GeneratedValue private Long id; @Column(name = "title") private String title; @JsonIgnoreProperties({"story"}) @OneToMany(mappedBy = "story", fetch = FetchType.LAZY) private List&lt;Tag&gt; tags; public Story(String title){ this.title = title; } public Story(){ } // getters &amp; setters }</pre><p> 标签.java</p><pre> @Entity @Table(name = "tags") public class Tag { @Id @GeneratedValue private Long id; @Column(name = "name") private String name; @JsonIgnoreProperties({"tags"}) @ManyToOne @JoinColumn(name = "story_id", nullable = false) @Cascade(org.hibernate.annotations.CascadeType.SAVE_UPDATE) private Story story; public Tag(String name, Story story){ this.name = name; this.story = story; } public Tag(){ } /// getters &amp; setters }</pre><p> StoryController.java</p><pre> @RestController public class StoryController { @Autowired StoryRepository storyRepository; @CrossOrigin(origins = "http://localhost:8080/api") @GetMapping(value = "/stories") public ResponseEntity&lt;List&lt;Story&gt;&gt; getAllStories(){ return new ResponseEntity&lt;&gt;(storyRepository.findAll(), HttpStatus.OK); } @CrossOrigin(origins = "http://localhost:8080/api") @GetMapping(value="/stories/tagSearch/{name}") public ResponseEntity&lt;Story&gt; getStoryByTag(@PathVariable String name) { return new ResponseEntity(storyRepository.findByTags_Name(name), HttpStatus.OK); } @CrossOrigin(origins = "http://localhost:8080/api") @GetMapping(value="/stories/{id}") public ResponseEntity&lt;Story&gt; getStory(@PathVariable Long id) { return new ResponseEntity(storyRepository.findById(id), HttpStatus.OK); } }</pre><p> StoryRepository.java</p><pre> @Repository public interface StoryRepository extends JpaRepository&lt;Story, Long&gt; { public List&lt;Story&gt; findByTags_Name(String name); }</pre><p> 尝试通过浏览器查询时,转到地址 localhost:8080/api/stories/tagSearch/?name="tag" 数据库返回数据库中的所有对象,而不是我要查找的结果。</p></div></object> Springboot JPA Repository 未释放 Hikari DB Connection
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM