如何解决用JOOQ进行内部联接时如何正确使用WHERE?
我刚刚沿着Postgres数据库在Spring Boot项目上设置了JOOQ,我很喜欢它!我认为在此之后我不会再使用ORM,但是在没有如此简单的CRUD查询的情况下我确实遇到了问题。
目前我不知道我的JOOQ查询写得不好还是我没有按预期方式处理返回类型。
我基本上是想在两个表之间做一个简单的 INNER JOIN :
-
QUESTIONS TABLE
+----+--------+----------------+-------------+
| question_id | question_body | question_answer
+----+--------+----------------+-------------+
| P_KEY INT | TEXT | JSON |
| | | |
+----+--------+----------------+-------------+
TESTS CONTENT
+----------------+-------------+
| question_id | test_id |
+----------------+-------------+
|P_KEY - INT | FKEY - INT |
+----------------+-------------+
使用这两个表,我正在尝试翻译此SQL查询
SELECT *
FROM questions q
INNER JOIN tests_content t ON q.question_id = t.question_id
WHERE t.test_id = 1007;
...进入一个JOOQ查询。我尝试了几种方法,包括文档中的相关方法以及在SO上找到的一些方法。基本上,我的JOOQ查询如下:
public Result<Record> queryMethod(){
return dslContext.select().
from(questions).
join(testsContent).
using(testsContent.QUESTION_ID).
where(testsContent.QUESTION_ID.eq(1007)).fetch();
}
但是我无法使它正常工作!我不知道是否必须创建一个自定义POJO来处理结果,我的JOOQ语法是否错误或是否未正确处理返回类型。
让我担心的另一件事是问题表的一个字段是JSON类型,也许也可能是一个问题。
如果有人可以帮助我,我将非常感激。
感谢阅读!
编辑1:
尝试提取到自定义POJO中,但查询根据请求返回一个空数组。
JOOQ查询:
public List<JoinQuestionsTest> query(){
return dslContext.select().from(questions)
.join(testsContent).using(testsContent.QUESTION_ID)
.where(testsContent.QUESTION_ID.eq(1007))
.fetchInto(JoinQuestionsTest.class);
}
POJO代码:
import org.jooq.JSON;
@NoArgsConstructor
@AllArgsConstructor
@Setter
@Getter
public class JoinQuestionsTest {
private int question_id;
private int test_id;
private String question_body;
private JSON question_answer;
}
编辑2:添加查询的记录器代码:
DEBUG 2786 --- [nio-8080-exec-1] org.jooq.tools.LoggerListener:
Executing query:
select "public"."questions"."question_id","public"."questions"."question_body","public"."questions"."question_explanation","public"."questions"."question_answer","public"."tests_content"."question_id","public"."tests_content"."test_id"
from "public"."questions"
join "public"."tests_content"
using ("question_id")
where "public"."tests_content"."question_id" = ?
DEBUG 2786 --- [nio-8080-exec-1] org.jooq.tools.LoggerListener:
-> with bind values:
select "public"."questions"."question_id","public"."tests_content"."test_id"
from "public"."questions"
join "public"."tests_content"
using ("question_id")
where "public"."tests_content"."question_id" = 1007
DEBUG 2786 --- [nio-8080-exec-1] org.jooq.tools.LoggerListener: Fetched result:
+-----------+-------------+--------------------+---------------+-----------+-------+
|question_id|question_body|question_explanation|question_answer|question_id|test_id|
+-----------+-------------+--------------------+---------------+-----------+-------+
Fetched row(s) : 0
2020-08-27 13:27:11.617 WARN 2786 --- [nio-8080-exec-2] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved
[org.springframework.web.method.annotation.MethodArgumentTypeMismatchException: Failed to convert value of type 'java.lang.String' to required type 'int'; nested exception is java.lang.NumberFormatException: For input string: "favicon.ico"]
编辑3:
似乎问题出在WHERE子句。我从JOOQ代码中删除了它,现在查询工作正常了。
return dslContext.select(
testsContent.QUESTION_ID,testsContent.TEST_ID,questions.QUESTION_BODY,questions.QUESTION_EXPLANATION,questions.QUESTION_ANSWER
).from(questions).join(testsContent).using(testsContent.QUESTION_ID).fetchInto(JoinQuestionsTest.class);
我还调整了POJO,因为似乎JSON数据是作为字符串而不是包含的JSON类型处理的(我不知道为什么后者存在)。 POJO现在看起来像这样:
@NoArgsConstructor
@AllArgsConstructor
@Setter
@Getter
public class JoinQuestionsTest {
private int question_id;
private int test_id;
private String question_body;
private String question_explanation;
private String question_answer;
}
当前正在尝试/研究如何使.where()方法起作用。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。