我正在使用 spring jpa 和 lombok 來定義 java bean 主題。每個主題都會有很多評論。我的onetomany配置是
@Entity
@Table(name = "TOPIC")
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Topic implements Serializable {
@OneToMany(
fetch = FetchType.LAZY,
cascade = CascadeType.REMOVE,
mappedBy = "topic"
)
private Set<Comment> comments= new HashSet<>();
我創建的restful api是這樣的。序列化似乎是問題所在,它總是獲取評論。正如 Chris 所提到的,我添加了@JsonIgnore,它似乎解決了這個問題。但是如果我想加載評論怎么辦,@JsonIgnore不會回傳序列化中的評論。
@GetMapping("/topics")
public List<Topic> getAllTopics(@SortDefault(sort = "topicName", direction = DESC) Sort sort) {
return topicService.getAllTopics(sort);
}
uj5u.com熱心網友回復:
我相信你真正需要的是一個投影。延遲獲取不是可以輕松配置運行時的東西,更不用說防止加載延遲專案了。
相反,您應該使用DTO類來宣告您想要從資料庫中獲取的資料,或者甚至更好地使用一個介面來說明要顯示的內容。
請參閱下面的存盤庫(我省略了服務部分,因為您也沒有顯示它):
public interface TopicRepository extends PagingAndSortingRepository<Topic, Long> {
List<Topic> findAll(Sort sort);
// bean convention getter declarations for fields to fetch
interface TopicWithoutComments {
Long getId();
String getTopicName();
}
List<TopicWithoutComments> findAllBy(Sort sort);
}
現在 yiu 需要單獨的方法(或您想決定是否顯示評論的任何其他方式),首先是原始方法:
@GetMapping("/topics")
public List<Topic> getAllTopics(@SortDefault(sort = "topicName",
direction = Direction.DESC) Sort sort) {
return topicRepository.findAll(sort);
}
它輸出類似:
休眠:從評論comments0_中選擇comments0_.topic_id作為topic_id3_0_0_,comments0_.id作為id1_0_0_,comments0_.id作為id1_0_1_,comments0_.text作為text2_0_1_,comments0_.topic_id作為topic_id3_0_1_其中comments0_.topic_id=
...
對于找到的每個主題。那么投影端點可能是這樣的:
@GetMapping("/topics/wocomments")
public List<TopicWithoutComments> getAllTopicsWithoutComments(
@SortDefault(sort = "topicName",
direction = Direction.DESC) Sort sort) {
return topicRepository.findAllBy(sort);
}
這將只列印一行(假設 Topic 上沒有其他一對多關系):
Hibernate:選擇topic0_.id作為col_0_0_,topic0_.topic_name作為col_1_0_從topic topic0_ order by topic0_.topic_name desc
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/382066.html
