[21000][1242]子查询returns多于1行

[21000][1242] Subquery returns more than 1 row

我的查询:

entityManager.createQuery("SELECT " +
                "q.id, " +
                "q.title, " +
                "q.user.fullName, " +
                "q.user.reputationCount, " +
                "q.viewCount, " +
                "q.countValuable, " +
                "q.persistDateTime,  " +
                "t.id, " +
                "t.name, " +
                "t.description, " +
                "(SELECT COUNT (a) FROM Answer a WHERE a.question.id = q.id), " +
                "(SELECT a.isHelpful FROM Answer a WHERE a.question.id = q.id) " +
                "FROM Question q JOIN q.tags t")

这里我得到错误 - [21000][1242] 子查询 returns 多于 1 行

通过异常的方法,我确定了这个查询字符串中的错误:

"(SELECT a.isHelpful FROM Answer a WHERE a.question.id = q.id) "

如何正确的请求才不会出现这个错误?谢谢!

子查询 returns 多于 1 行 ,这仅仅意味着您的查询没有返回任何行以使外部 select 语句起作用。

"(SELECT a.isHelpful FROM Answer a WHERE a.question.id = q.id) "

您必须应用一组条件来唯一地过滤出您的数据,或者使用联接来组合您的 table 答案和问题,然后相应地过滤数据。

您还可以通过 GROUP_CONCAT Mysql 函数将每一行数据分组到一列中,如下所示:

"(SELECT GROUP_CONCAT(a.isHelpful) FROM Answer a WHERE a.question.id = q.id) "

尽管 GROUP_CONCAT 在 Mysql 中不可用,为此您还可以按照此 post.

中所述在休眠中绑定 SQL 函数

聚合和限制两种常见方式:

(SELECT MAX(a.isHelpful) FROM Answer a WHERE a.question.id = q.id)
(SELECT a.isHelpful FROM Answer a WHERE a.question.id = q.id LIMIT 1)

但是,这些实际上只是用来绕过 "issue" 数据的技巧。我把问题放在引号中,但真正的问题可能是你对数据的理解,而不是数据本身。

你应该明白为什么会有重复了。然后决定你想要哪个值。并根据您的需要实施正确的逻辑。

经过一天的各种尝试和错误,我找到了以下解决方案,希望有人开阔眼界,帮助解决他们的问题:

entityManager.createQuery("SELECT " +
                "q.id, " +
                "q.title, " +
                "q.user.fullName, " +
                "q.user.reputationCount, " +
                "q.viewCount, " +
                "q.countValuable, " +
                "q.persistDateTime,  " +
                "t.id, " +
                "t.name, " +
                "t.description, " +
                "(SELECT COUNT (a) FROM Answer a WHERE a.question.id = q.id), " +
                "(SELECT CASE WHEN MAX (a.isHelpful) > 0 THEN true ELSE false END FROM Answer a WHERE a.question.id = q.id) " +
                "FROM Question q JOIN q.tags t")