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 中,您可以拥有任意数量的属性。此外,您可以拥有多个对象的属性。
如何在 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 中,您可以拥有任意数量的属性。此外,您可以拥有多个对象的属性。