在我们的领域模型中,

@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是joda-time库中的DateTime类型,我将其设置为:
query.setParameter("tomorrow", DateTime.now().plusDays(1))

现在这部分起作用,我只得到那些正确匹配的QuestionSets,但是我也得到了所有问题,即使例如IN仅匹配了其中一个。

我的期望过高还是有某种方法可以限制questions列表中的实例数量?

最佳答案

不会。JPA不会向您返回与数据库实际情况不符的实体。如果一个QuestionSet在数据库中有4个问题,那么QuestionSet实体将有4个问题。

如果您只想回答一些问题,请选择您感兴趣的问题,然后导航至其问题集。

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

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

关于jpa - jpql-在一对多集合中选择一些元素,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16886279/

10-09 09:00