我的查询:
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]子查询返回的行多于1
通过异常方法,我确定此查询字符串中的错误:
"(SELECT a.isHelpful FROM Answer a WHERE a.question.id = q.id) "
如何发出正确的请求,以免出现此错误?谢谢!
答案 0 :(得分:0)
子查询返回多于1行,这仅表示您的查询未返回一行以使外部select语句起作用。
"(SELECT a.isHelpful FROM Answer a WHERE a.question.id = q.id) "
您必须应用一组条件来唯一地过滤数据,或使用联接将表的Answer和Question组合在一起,然后相应地过滤数据。
您还可以通过GROUP_CONCAT Mysql函数将每一行数据分组为一列,如下所示:
"(SELECT GROUP_CONCAT(a.isHelpful) FROM Answer a WHERE a.question.id = q.id) "
尽管GROUP_CONCAT在Mysql中不可用,因为您还可以按照本post中的说明在休眠模式下绑定SQL函数。
答案 1 :(得分:0)
两种常见的方式是聚集和限制:
(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)
但是,这些实际上只是黑客解决数据的“问题”。我用引号括起来,但真正的问题可能是您对数据的理解,而不是数据本身。
您应该了解为什么重复。然后决定您想要哪个值。并根据您的需要实施正确的逻辑。
答案 2 :(得分:0)
经过一天的反复试验,我找到了以下解决方案,希望有人能开阔视野并帮助解决他们的问题:
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")