Я разрабатываю REST API, и у меня есть Question
родитель и Answer
(и User
, связанный с обоими) детьми.Чего я хочу добиться, так это того, что с questionService.getAllQuestions()
из базы данных загружаются только вопросы и пользователи.Когда я звоню questionService.getQuestion(id)
, я хочу, чтобы этот вопрос был загружен из базы данных вместе со всеми ответами и пользователями (которые ответили), которые содержит этот вопрос.Spring-boot
автоматически преобразует все данные в объекты JSON. Но в моей текущей ситуации, даже с getAllQuestions()
, ВСЕ данные загружаются из базы данных.Это бессмысленно для запроса обзора вопроса, но необходимо для запроса подробностей вопроса.
Родитель вопроса Объект:
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonManagedReference;
import javax.persistence.*;
import java.sql.Timestamp;
import java.util.Set;
@Entity
@Table(name = "vragen")
public class Question extends BaseEntity {
@Column(name = "vraag")
private String question;
@Column(name = "bericht")
private String message;
@ManyToOne
@JoinColumn(name = "gebruiker")
private Gebruiker gebruiker;
@Column(name = "beantwoord", insertable = false)
private boolean answered;
@Column(name = "gepost_op", insertable = false)
private Timestamp postedOn;
@Column(name = "actief", insertable = false)
@JsonIgnore
private boolean active;
@OneToMany(mappedBy = "question")
@JsonManagedReference
private Set<Answer> answers;
public Question() {}
public Question(String question, String message, Gebruiker gebruiker) {
this.question = question;
this.message = message;
this.gebruiker = gebruiker;
}
public String getQuestion() {
return question;
}
public void setQuestion(String question) {
this.question = question;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public Gebruiker getGebruiker() {
return gebruiker;
}
public void setGebruiker(Gebruiker gebruiker) {
this.gebruiker = gebruiker;
}
public boolean isAnswered() {
return answered;
}
public void setAnswered(boolean answered) {
this.answered = answered;
}
public Timestamp getPostedOn() {
return postedOn;
}
public boolean isActive() {
return active;
}
public void setActive(boolean active) {
this.active = active;
}
public Set<Answer> getAnswers() {
return answers;
}
public void setAnswers(Set<Answer> answers) {
this.answers = answers;
}
}
Объект ответа:
import com.fasterxml.jackson.annotation.JsonBackReference;
import javax.persistence.*;
import javax.validation.constraints.Size;
import java.sql.Timestamp;
@Entity
@Table(name = "antwoorden")
public class Answer extends BaseEntity {
@Size(min = 10)
@Column(name = "bericht")
private String message;
@ManyToOne
@JoinColumn(name = "gebruiker")
private Gebruiker gebruiker;
@ManyToOne
@JoinColumn(name = "vraag")
@JsonBackReference
private Question question;
@Column(name = "gepost_op", insertable = false)
private Timestamp postedOn;
@Column(name = "actief", insertable = false)
private boolean active;
public Answer() {}
public Answer(String message, Gebruiker gebruiker, Question question) {
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public Gebruiker getGebruiker() {
return gebruiker;
}
public void setGebruiker(Gebruiker gebruiker) {
this.gebruiker = gebruiker;
}
public Question getQuestion() {
return question;
}
public void setQuestion(Question question) {
this.question = question;
}
public Timestamp getPostedOn() {
return postedOn;
}
public boolean isActive() {
return active;
}
public void setActive(boolean active) {
this.active = active;
}
}
@OneToMany
по умолчанию лениво загружает ответы, чего не происходит, даже если я явно установил эту опцию.
Можно ли этого добиться с помощьюJPA или мне нужно писать запросы вручную в пользовательской реализации?