Spring Boot, dodatkowe wartości w responsie

Spring Boot, dodatkowe wartości w responsie
F9
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 19
0

Witam,

fragment mojej bazy danych wygląda tak

Kopiuj
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ź

Kopiuj
 {
    "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:

Kopiuj
 {
    "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

Kopiuj
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:

Kopiuj
@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. 

}
Kopiuj
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?

SZ
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 616
0

Zrób to za pomocą @Projection

jarekczek
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Siemianowice Śląskie
  • Postów: 500
0

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

F9
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 19
0

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

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.