2017-05-29 15 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) 

は、すべての質問のために2つだけ可能な答えがあることができます。 POSTを使用して質問に回答します(リソース/回答)。

今、私は/質問/ 1にGET行うときに(私はこれに@JsonIgnoreを使用しているため、利用者なし)、それは

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

この答えを返し

今、私はGETリクエストをしたいのですがそれに応答して例えば複数の値(質問を作成し、最初の答えと第二の答えを選択した回数を示して二つのカウンタユーザのログインを取得します。

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

どうやってするの? 私はSpringbootで1つのクエリでそれをやりたいです。モデルと

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変数を書き込むことができます。しかし、私は多くのデータベースクエリを作成したくありません - 私は1つのクエリでそれをやりたい、それは速いです。

答えて

0

データベースからクライアントにオブジェクトを返すのは悪い習慣です。アノテーション@JsonIgnoreを削除してDTOを使用する必要があります。これをチェックしてください。link

DTOには、必要な数のプロパティを設定できます。また、複数のオブジェクトのプロパティを持つこともできます。

+0

私はDTOクラスを作成しました。可能であれば私に教えてください。どのようにして1つのクエリを使ってオブジェクトを作成できますか(私はSELECTを1つしか使用しません)。今私のリポジトリクラスでは、ネイティブクエリを持つメソッドがありますが、コレクション全体を返すときは、オブジェクトを作成して応答するのに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 (+)、(+)、(+)、(+)、(+)、(+)、(+)、 \t \t \t "(SELECT u.login FROM user u WHERE u.id = q。USER_ID)質問Qから 'CREATEDBY')」+ \t \t \t "") \t一覧 findAdditionalInfo()AS; ExampleDTOはあなたがこれはこれではない一つのリクエスト –

+0

を作成DTOある 私は何をすることができますか? "原因:java.lang.IllegalArgumentException:org.hibernate.hql.internal.ast.QuerySyntaxException:IDENTが、行1、列171の近くに 'first_count'が見つかりました[SELECT new QuestionDTO(。 ..) " –

関連する問題