繁体   English   中英

Springboot + JPA:列出每个字段类型的所有字段名

[英]Springboot + JPA : List all fieldnames for each fieldtype

我正在为我的项目使用 Spring Boot + JPA。 我想要我表中每种typefieldName列表。 所以我通过使用JPQL使用带有命名参数的查询来做到这一点。 我在存储库中做了两种方法。

  1. 第一种方法:
    此方法用于获取不同的type列表。
      @Query(value = "SELECT DISTINCT fc.type FROM FieldCapabilityModel fc")
      List<String> findDistinctType();
  1. 第二种方法:
    此方法用于获取特定type的名称列表。
     @Query("SELECT fc.fieldName FROM FieldCapabilityModel fc where fc.type=:type")
     List<String> findByType(@Param("type) String type);

这是我的service组件。

@Service
public class FieldCapabilityService {

    @Autowired
    FieldCapabilityRepo fcRepo;

    public List<Map<String, Object>> getAllFieldAndType() { 
                // First Method is called here  
        return fcRepo.findDistinctType().stream().map(type -> {
                Map<String, Object> resultMap = new HashMap<String, Object>();
                resultMap.put("type", type);
                // Second Method is called here
                resultMap.put("field", fcRepo.findByType(type));
                return resultMap;
            }).collect(Collectors.toList());            
    }
}

当我使用 rest controller 打电话时,我的 API 响应是:

{
  "code": 200,
  "message": "Data Fetched",
  "data": [
    {
      "field": [
        "name.lname",
        "city",
        "name.fname",
        "name",
        "id"
      ],
      "type": "text"
    },
    {
      "field": [
        "_ignored"
      ],
      "type": "_ignored"
    },
    {
      "field": [
        "_seq_no"
      ],
      "type": "_seq_no"
    }
  ]
}

我得到了我想要的确切的 output,这也是一个简单的数据响应,我有超过 16 种类型。 尽管我想知道这是一种有效且稳健的方式。
我的问题是:

我们可以为此使用任何其他查询吗?
如果可以,我们可以使用@NamedQuery代替这个,那为什么?
这种执行的简化、稳健和高效的方法应该是什么?

如果我想改进这个解决方案的任何内容,或者如果它比这个解决方案更好,请给我建议或者提出一个新的解决方案。

您可以在一个查询中获取所有类型和字段名称

@Query(value = "SELECT NEW org.apache.commons.math3.util.Pair(fc.type as type, fc.fieldName as name) FROM FieldCapabilityModel fc")
  public List<Pair<Integer, Integer>> findAllTypeWithName();

然后汇总数据。 创建一个类型为 map,其中 Key 是 fieldNames

Map<String, List<String>> fieldNameByType = fcRepo.findAllTypeWithName()
        .stream()
        .collect(Collectors.groupingBy(Pair::getKey, 
                Collectors.mapping(Pair::getValue, Collectors.toList())));

然后,您可以使用此 map 准备您的回复。

return fieldNameByType.entrySet().stream().map(e -> {
                Map<String, Object> resultMap = new HashMap<String, Object>();
                resultMap.put("type", e.getKey());
                resultMap.put("field", e.getValue());
                return resultMap;
            }).collect(Collectors.toList()); 

列表中的 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.

相关问题 如何显示用户和他租用的所有书籍的列表 - SpringBoot、JPA、MySql 列表中的 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 DTO + JPA 带列表<T>财产 从 SpringBoot JPA 存储库中的所有表中获取结果 如何在springboot webservice中列出所有请求参数? 使用SpringBoot在Jpa中查询时出错 Springboot JPA依赖异常 Java JPA SpringBoot Springboot的JDBC / JPA SpringBoot 上 JPA​​ 上的 NullPointerException
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM