2016-08-30 2 views
3

Я хотел бы написать этот SQL запрос в JPA 2.1 Критерии API:Как ссылаться на элемент внешнего запроса во внутреннем запросе?

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)); 

Но это создает вторую группу. Sql результат:

SELECT DISTINCT ... 
FROM T_QUESTION question0_ 
WHERE 1     = 
    (SELECT COUNT(question3_.question_id) 
    FROM T_QUESTION_TAG questionta2_ 
    INNER JOIN T_QUESTION question3_ 
    ON questionta2_.question_id=question3_.question_id 
    WHERE questionta2_.tag_id IN (18)); 
+0

В вашем втором фрагменте кода, что означает 'cq'? (пожалуйста, обновите фрагмент кода соответственно) – Riduidel

+0

И я точно не знаю, как работает JPA в этой точке, но кажется, что ваш 'WHERE ... = 2' становится' WHERE 1 = ... ' – Riduidel

ответ

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()) 
     ); 

Используйте кандидата из внешнего запроса («вопросы») для обозначения внешнего запроса, и дон Не понимаю, почему вы тоже присоединились ранее. Я предположил, что поле в «Вопросе» и «Теге» называется «id».