【发布时间】:2021-04-09 19:34:47
【问题描述】:
我的数据库 Story 和 Tag 中的两个对象之间存在一对多关系。
我希望能够获取所有具有带有字符串名称的 Tag 对象的 Story 对象。
Story.java
@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<Tag> tags;
public Story(String title){
this.title = title;
}
public Story(){
}
// getters & setters
}
标签.java
@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 & setters
}
StoryController.java
@RestController
public class StoryController {
@Autowired
StoryRepository storyRepository;
@CrossOrigin(origins = "http://localhost:8080/api")
@GetMapping(value = "/stories")
public ResponseEntity<List<Story>> getAllStories(){
return new ResponseEntity<>(storyRepository.findAll(), HttpStatus.OK);
}
@CrossOrigin(origins = "http://localhost:8080/api")
@GetMapping(value="/stories/tagSearch/{name}")
public ResponseEntity<Story> 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<Story> getStory(@PathVariable Long id) {
return new ResponseEntity(storyRepository.findById(id), HttpStatus.OK);
}
}
StoryRepository.java
@Repository
public interface StoryRepository extends JpaRepository<Story, Long> {
public List<Story> findByTags_Name(String name);
}
尝试通过浏览器查询时,转到地址 localhost:8080/api/stories/tagSearch/?name="tag" 数据库返回数据库中的所有对象,而不是我要查找的结果。
【问题讨论】:
标签: java spring-boot jpa one-to-many findby