gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 03:12:19 25 4
gpt4 key购买 nike

我想在 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));

但是它创建了第二个 Join。 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));

最佳答案

我希望子查询更像这样

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”。

关于jpa - 如何在内部查询中引用外部查询的成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39227908/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com