Return 更多属性作为响应(来自数据库模型外部)

Return more properties in response (from outside the database model)

如何在 GET 响应中 return 更多值?

我在数据库中的表如下所示:

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

每个问题只能有两个可能的答案。 我使用 POST 来回答问题(资源/答案)。

现在,当我执行 GET /questions/1 时,它 return 就是这个答案

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

我的 class 模型如下所示:

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

}

我的存储库 class 如下所示:

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

我不想在数据库中创建新行。

我知道我可以在 Controller 的 class 中填充 @Transient 变量。但我不想做很多数据库查询——我想在一个查询中完成,这样更快。

从数据库到客户端 return 对象是不好的做法。您应该删除注释 @JsonIgnore 并且您应该使用 DTO,检查这个 link

在 DTO 中,您可以拥有任意数量的属性。此外,您可以拥有多个对象的属性。