Jpa jpql-选择一对多集合中的某些元素

Jpa jpql-选择一对多集合中的某些元素,jpa,jpql,Jpa,Jpql,在我们的领域模型中,我们有 @Entity @SequenceGenerator(name = "wordlist_seq", sequenceName = "wordlist_seq") public class QuestionSet { @Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "wordlist_seq") private Long id; @OneToMany(cascade

在我们的领域模型中,我们有

@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;
日期是joda时间库中的类型
DateTime
,我将其设置为:

query.setParameter("tomorrow", DateTime.now().plusDays(1))
现在这部分起作用了,我只得到了正确匹配的
问题集
,但我也得到了所有问题,例如,即使只有一个问题与
中的
匹配


我的期望值是否过高,或者是否有办法限制
问题列表中的实例数量?

否。JPA不会返回与数据库实际情况不匹配的实体。如果一个问题集在数据库中有4个问题,那么该问题集实体将有4个问题

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

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

 SELECT s, q FROM QuestionSet s JOIN s.questions q WHERE ...

更好的答案是更新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;
  }
}
@实体
@SequenceGenerator(name=“wordlist_-seq”,sequenceName=“wordlist_-seq”)
公共类问题集{
@身份证
@GeneratedValue(策略=GenerationType.SEQUENCE,generator=“wordlist_seq”)
私人长id;
@OneToMany(级联=级联类型.ALL)
私人名单问题;
公共列表问题(){
关于(问题q:问题){
List filtered=new ArrayList();
如果(q.date

现在,您可以调用getQuestions函数并获得过滤器值。您可以在getQuestions中添加过滤器局部变量并使用switch case来确定过滤器应该如何工作

关于您给出的查询,它将返回什么类型的对象?列表,其中每个对象[]将包含一个问题集作为第一个元素,一个问题作为第二个元素。谢谢,它可能会派上用场。
@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;
  }
}