2017-05-29 29 views
0

如何在GET響應中返回更多值?返回更多屬性(來自數據庫外部模型)

我在數據庫中的表是這樣的:

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

對於每一個問題只能有兩個可能的答案。 我使用POST回答問題(資源/答案)。

現在,當我得到/問題/ 1,它返回這個答案

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

(沒有用戶,因爲我用@JsonIgnore這個)

現在,我想使GET請求和響應更值獲得(例如誰創造,展示了第一個答案和第二答案多少次選擇的問題和兩個計數器用戶的登錄名。

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

怎麼做? 我很想用Springboot中的一個查詢來完成它。 例如像這樣:

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 

我與模型類看起來是這樣的:

@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> { 
} 

我不希望創建數據庫中的新行。

我知道我可以在控制器類中填寫@Transient變量。但我不想做很多數據庫查詢 - 我想在一個查詢中完成,速度更快。

回答

0

將對象從數據庫返回給客戶端是不好的做法。你應該刪除註釋@JsonIgnore,你應該使用DTO,檢查這個link

在DTO中,你可以擁有任意數量的屬性。此外,您可以擁有來自多個對象的屬性。

+0

好的,我創建了DTO類。你能告訴我(當然,如果可能的話)我怎樣才能通過使用一個查詢創建對象(我只想使用一個SELECT)。現在在我的Repository類中,我有使用本機查詢的方法,但是當我想要返回整個集合時,需要2-3秒來創建對象並做出響應。 – foxbuur

+1

您可以創建將返回您想要的DTO的查詢。例如: @Query(「SELECT new ExampleDTO(q.id,q.value,q.first_answer,q.second_answer,q.created_date,q.status,」+ \t \t \t「(SELECT COUNT(answer)FROM答案爲'first_count',「+ \t \t \t」(SELECT COUNT(answer)FROM answer WHERE answer = 2 AND question_id = q.id)AS'second_count',「+ \t \t \t「(選擇u.login FROM用戶u其中u.id = q。USER_ID)AS 'createdBy')」 + \t \t \t 「從提問Q」) \t名單 findAdditionalInfo(); 其中ExampleDTO是DTO您創建 –

+0

這將返回一個請求 –

相關問題