Spring Boot, dodatkowe wartości w responsie

0

Witam,

fragment mojej bazy danych wygląda tak

user(id, login, password)
question(id, user_id, value, created_date, status, first_answer, second_answer)
answer(id, question_id, user_id, value)

Obecnie jak robię zapytanie GET na zasobie /questions/1, to otrzymuje taką odpowiedź

 {
    "id" : 1,
    "value" : "Example",
    "createdDate" : 1495825431000,
    "firstAnswer" : "A",
    "secondAnswer" : "B",
    "status" : "accepted"
}

Chciałbym jednak dodać tam kilka dodatkowych pól, m.in. login autora pytania oraz ile razy wybrano odpowiedź pierwszą, bądź drugą. Mniej więcej coś takiego:

 {
    "id" : 1,
    "value" : "Example",
    "createdDate" : 1495825431000,
    "firstAnswer" : "A",
    "secondAnswer" : "B",
    "status" : "accepted",
    "createdBy" : "John",
    "firstCount" : 120,
    "secondCount" : 80
}

Jak to zrobić bez modyfikowania bazy danych?

Zapytanie sql, które można by wykonać mogłoby wyglądać następująco

SELECT q.id, q.value, q.first_answer, q.second_answer, q.created_date, q.status,
(SELECT COUNT(answer) FROM answer WHERE answer = 1 AND question_id = q.id) AS 'first_count', 
(SELECT COUNT(answer) FROM answer WHERE answer = 2 AND question_id = q.id) AS 'second_count',
(SELECT u.login FROM user u WHERE u.id = q.user_id) AS 'createdBy'
FROM question q

Plik z modelem Questions wygląda następująco:

@Entity
@Table(name = "question")
public class Question {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column
    private Integer id;

    @JsonIgnore
    @ManyToOne
    @JoinColumn(nullable = false)
    private User user;

    @Column(nullable = false)
    private String value;

    @Column(nullable = false)
    private Timestamp createdDate;

    @Column(nullable = false)
    private String firstAnswer;

    @Column(nullable = false)
    private String secondAnswer;

    @Column(nullable = false)
    private String status;

    public Question() {
    }

    //getters, setters, etc. 

}
public interface QuestionsRepository extends CrudRepository<Question, Integer> {
}

Próbowałem modyfikować plik z modelem poprzez dodanie annotacji @transient, a następnie przez wykonanie native query, ale wartości były null.
Jak dodać te dodatkowe informacje do body, bez modyfikowania bazy danych?

0

Zrób to za pomocą @Projection

0

Ale nie masz kontrolera? To trzeba oprogramować w kontrolerze, np. przez wypełnienie tych pól transient.

0

A mógłbyś prosić o przykład, jak użyć @Projection?

1 użytkowników online, w tym zalogowanych: 0, gości: 1