簡體   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