java 使用一个 JPQL 查询连接多个表

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/44144693/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-11-03 07:58:59  来源:igfitidea点击:

Join multiple tables with one JPQL query

javajpajpql

提问by acroscene

I got this sql-query I want to create as query in JPQL but I cannot get it right. I got a manytoone relationship between QuestionAnswers and QuizQuestions:

我得到了这个 sql 查询,我想在 JPQL 中创建为查询,但我做对了。我在 QuestionAnswers 和 QuizQuestions 之间有一个多对一的关系:

SQL:

查询语句:

SELECT quizName, question, answer FROM Quiz 
JOIN QuizQuestions on Quiz.quizId = QuizQuestions.Quiz_QuizId 
JOIN QuestionAnswers on QuizQuestions.questionId = QuestionAnswers.question_questionId 
WHERE quiz.quizId = 1;

JPQL query:

JPQL 查询:

Query query = entityManager.createQuery("SELECT q.quizName, f.question, a.answer FROM Quiz q, QuizQuestions f, QuestionAnswers a LEFT JOIN QuestionAnswers ON f.questionId=a.question.questionId");

I get syntax error in Intellij.

我在 Intellij 中遇到语法错误。

What can be wrong?

有什么问题?

Im using EclipseLink

我正在使用 EclipseLink

EDITsolved it like this with just one join:

EDIT只用一个连接就解决了这个问题:

Query query = entityManager.createQuery("SELECT f.quiz.quizName FROM QuizQuestions f JOIN QuestionAnswers qa WHERE f.questionId = qa.question.questionId");

回答by Dherik

Probably, you are looking for a JPQL like this:

可能您正在寻找这样的 JPQL:

SELECT quiz.name, quizquestion.question, questionasnswer.answer FROM Quiz quiz
JOIN quiz.quizQuestions quizquestion
JOIN quizquestion.questionAnswers questionasnswer
WHERE quiz.id = 1;

I would evict solutions with qa.question.questionId(tableA.tableB.column), because the JPA framework not always generate nice SQLs from this. Always explicit the JOINs in the JPQL.

我会用qa.question.questionId(tableA.tableB.column)驱逐解决方案,因为 JPA 框架并不总是从中生成好的 SQL。始终在 JPQL 中显式显示 JOIN。