簡體   English   中英

SpringBoot DTO + JPA 帶列表<T>財產

[英]SpringBoot DTO + JPA with List<T> property

假設我有以下實體,(為了簡單起見,我跳過了構造函數):

public class Person {
    int id;
    String name;
    String lastName;
    Date birthday;
    List<Vehicles> vehicles;
}

我想創建一個 DTO,以便僅從數據庫中獲取我需要的內容:

public class PersonDTO {
    int id;
    String name;
    List<Vehicles> vehicles;
}

我的 Crud 存儲庫如下所示:

Person findById(int personId);

但我想把它改成:

PersonDTO findById(int personId);

如果我刪除車輛屬性(是一個列表),它可以完美運行,但我確實需要這個列表。 有什么線索嗎?

引用Spring Data JPA 參考

定義投影的另一種方法是使用值類型 DTO(數據傳輸對象),這些 DTO 包含應該檢索的字段的屬性。 這些 DTO 類型可以以與使用投影接口完全相同的方式使用,除了不發生代理並且不可以應用嵌套投影

您的List<Vehicles> vehicles是嵌套投影,因此您的方法不適用。 在這種情況下,您需要使用基於界面的投影

public interface PersonProjection {

    int getId();

    String getName();

    List<VehicleProjection> getVehicles();

    interface VehicleProjection {

        // Getters for desired fields of Vehicle as above for Person(Projection)

    }

}

然后您可以將存儲庫方法更改為

PersonProjection findById(int personId);

不幸的是,基於接口的方法性能稍差,因為正如參考文檔所述,會發生代理。

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

相關問題 列表中的 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> 這可能嗎:JPA/Hibernate query with list property in DTO method Springboot + JPA:列出每個字段類型的所有字段名 SpringBoot 查詢 DTO Springboot 映射和 DTO SpringBoot DTO 驗證 springboot jpa無法創建表 Spring數據jpa,jparepository返回字符串列表代替DTO對象 帶有 JPA 休眠的 DTO 模式 JPA 實體的 DTO 生成器
 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM