2

私たちのドメインモデルでは

@Entity
@SequenceGenerator(name = "wordlist_seq", sequenceName = "wordlist_seq")
public class QuestionSet {
  @Id
  @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "wordlist_seq")
  private Long id;

  @OneToMany(cascade = CascadeType.ALL)
  private List<Question> questions;

そして、述語に一致QuestionSetするコレクションに少なくとも1つの質問があるすべてのインスタンスを取得するクエリを書きたいと思いました。また、コレクションに一致した質問のみを持ちたいと思いました。questionsINquestions

ここに私が書いたクエリがあります:

SELECT s FROM QuestionSet s JOIN s.questions q WHERE q IN (SELECT ar.question FROM AppointedRepetition ar WHERE ar.date < :tomorrow)

date はDateTimejoda-time ライブラリのタイプで、次のように設定します。

query.setParameter("tomorrow", DateTime.now().plusDays(1))

これは部分的に機能するようになりQuestionSetsました。適切に一致したものだけを取得していますが、たとえばIN.

私の期待は高すぎますか、questionsそれともリスト内のインスタンスの数を制限する方法はありますか?

4

2 に答える 2

0

より良い答えは、ゲッター関数を更新することです。

@Entity
@SequenceGenerator(name = "wordlist_seq", sequenceName = "wordlist_seq")
public class QuestionSet {
  @Id
  @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "wordlist_seq")
  private Long id;

  @OneToMany(cascade = CascadeType.ALL)
  private List<Question> questions;

  public List<Question> getQuestions() {
    for(Question q: questions) {
      List<Question> filtered = new ArrayList<Question>();
      if(q.date < DateTime.now().plusDays(1)) filtered.add(q);
    }
    return filtered;
  }
}

これで getQuestions 関数を呼び出すことができ、フィルター値を取得できます。フィルタ ローカル変数を追加し、getQuestions 内でスイッチ ケースを使用して、フィルタがどのように動作するかを決定できます。

于 2016-01-18T06:18:40.410 に答える