Jpa 如何在内部查询中引用外部查询的成员?

Jpa 如何在内部查询中引用外部查询的成员?,jpa,criteria-api,Jpa,Criteria Api,我想在JPA 2.1 Criteria API中编写此SQL查询: select * from t_question q where (select count(*) from t_question_tag tag where q.question_id = tag.question_id AND tag.tag_id in (18, 1) ) = 2; 我不知道如何在内部查询中引用外部问题成员 我目前正处于这一点: CriteriaQuer

我想在JPA 2.1 Criteria API中编写此SQL查询:

select * from t_question q
where
(select count(*) from t_question_tag tag 
   where 
       q.question_id  = tag.question_id
       AND tag.tag_id in (18, 1)
) = 2;
我不知道如何在内部查询中引用外部问题成员

我目前正处于这一点:

      CriteriaQuery<Question> cq = criteriaBuilder.createQuery(Question.class);
Root<Question> questions = cq.from(Question.class);
cq.distinct(true);

  Subquery<Long> selectTags = cq.subquery(Long.class);
  Root<QuestionTag> qt = selectTags.from(QuestionTag.class);
  Join<QuestionTag, Question> qtJoin = qt.join("question");
  selectTags
    .select(criteriaBuilder.count(qtJoin))
    .where(
        qt.get("tag").in(filter.getTags())
        );
  cq.where(criteriaBuilder.and(insArray),
      criteriaBuilder.equal(criteriaBuilder.literal(filter.getTags().size()), selectTags));

我希望子查询更像这样

Subquery<Long> selectTags = cq.subquery(Long.class);
Root<QuestionTag> qt = selectTags.from(QuestionTag.class);
selectTags.select(criteriaBuilder.count(qt));
selectTags.where(
        criteriaBuilder.equal(questions.get("id"), qt.get("id")),
        qt.get("tag").in(filter.getTags())
        );
Subquery selectTags=cq.Subquery(Long.class);
Root qt=selectTags.from(QuestionTag.class);
selectTags.select(criteriaBuilder.count(qt));
选择Tags.where(
criteriaBuilder.equal(questions.get(“id”)、qt.get(“id”),
(filter.getTags()中的qt.get(“tag”).in
);

使用外部查询中的候选者(“问题”)来引用外部查询,并且也不了解以前为什么要加入。我假设“Question”和“Tag”中的字段都称为“id”。

在第二个代码片段中,
cq
代表什么?(请相应地更新代码片段)我不知道JPA在这一点上是如何工作的,但似乎您的
WHERE…=2
变为
其中1=…
Subquery<Long> selectTags = cq.subquery(Long.class);
Root<QuestionTag> qt = selectTags.from(QuestionTag.class);
selectTags.select(criteriaBuilder.count(qt));
selectTags.where(
        criteriaBuilder.equal(questions.get("id"), qt.get("id")),
        qt.get("tag").in(filter.getTags())
        );