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中至少有一个与谓词匹配的问题的所有实例,而且我只想在questions集合中包含匹配IN的那些问题questions

这是我写的查询:

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

date 是DateTime来自 joda-time 库的类型,我将其设置为:

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

现在这部分工作,我只得到那些QuestionSets被正确匹配的问题,但我也得到了所有问题,即使例如只有一个问题与IN.

我的期望太高还是有什么方法可以限制questions列表中的实例数量?

4

2 回答 2

7

不会。JPA 不会返回与数据库实际不匹配的实体。如果 QuestionSet 在数据库中有 4 个问题,则 QuestionSet 实体将有 4 个问题。

如果您只想要一些问题,请选择您感兴趣的问题,然后导航到他们的问题集。

或者执行以下查询,它将返回匹配的问题集和匹配的问题:

 SELECT s, q FROM QuestionSet s JOIN s.questions q WHERE ...
于 2013-06-02T21:27:13.883 回答
0

更好的答案是更新你的 getter 函数。

@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 中使用 switch case 来确定过滤器应该如何工作。

于 2016-01-18T06:18:40.410 回答