2017-05-29 30 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

这将返回一个请求 –

相关问题