everyone。使用多个连接将MYSQL查询转换为HQL
我使用Grails与MySQL 3.3.0.M2框架作为数据源下面的SQL查询工作正常
SELECT
c.name,
SUM(CASE
WHEN t.status = 'open' THEN 1
ELSE 0
END) 'open',
SUM(CASE
WHEN t.status = 'pending' THEN 1
ELSE 0
END) 'in progress',
SUM(CASE
WHEN t.status = 'closed' THEN 1
ELSE 0
END) 'closed'
FROM
tickets t
INNER JOIN
users u ON t.user_id = u.id
INNER JOIN
user_coordinations uc ON uc.user_id = u.id
INNER JOIN
coordinations c ON c.id = uc.coordination_id
GROUP BY 1
我使用隐式连接翻译成HQL,但我得到错误的结果,这里是HQL查询:
SELECT
c.name,
SUM(CASE
WHEN t.status = 'open' THEN 1
ELSE 0
END),
SUM(CASE
WHEN t.status = 'pending' THEN 1
ELSE 0
END),
SUM(CASE
WHEN t.status = 'closed' THEN 1
ELSE 0
END)
FROM
Ticket t, User u, UserCoordination uc, Coordination c
WHERE
MONTH(t.dateCreated) = :month
GROUP BY 1
为了得到正确的结果堆栈溢出用户帮助我明白,查询需要使用显式连接,这里的问题是:Group by a field that does not belongs to the consulted table
现在我用下面的查询尝试:
SELECT
c.name,
SUM(CASE
WHEN t.status = 'open' THEN 1
ELSE 0
END),
SUM(CASE
WHEN t.status = 'pending' THEN 1
ELSE 0
END),
SUM(CASE
WHEN t.status = 'closed' THEN 1
ELSE 0
END)
FROM
Ticket t
INNER JOIN
User u
INNER JOIN
UserCoordination uc
INNER JOIN
Coordination c
WHERE
MONTH(t.dateCreated) = :month
GROUP BY 1
但我得到一个com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException与消息引起您有一个错误的SQL语法;检查对应于你的MySQL服务器版本的手册正确的语法使用近“内部联接user_coordinations usercoordi2_的内连接配位coordinat”在行1
感谢您的帮助和时间
感谢您回答@vahid。 '选择新... ...对我来说是新的。我可以看到构建查询的优点。关于这个问题,我得到一个_org.hibernate.QueryException_引起的消息:_could不能解析属性:userCoordination:ni.edu.ucc.leon.User_ – user615274
我认为这是因为有一个一对多的用户和协调。我如何在查询中表达这一点?在这个位置有一个SQL小提琴:http://sqlfiddle.com/#!9/9ed08/1 – user615274
@yuor第一个问题,你有'UserCoordination'我不知道你的域对象映射是什么。所以如果'User hasMany = [ucord:UserCoordination]'那将是'left join u.ucord uc'这是你在域对象中声明的映射。关于你的第二个问题,一对多是通过“左连接”来满足的,在这里某些东西是空的或者某些东西有一些价值,这将捕获所有东西。如果你从'join'中省略'left'字,那么它会列出1条记录。所以当左连接和user1有两条记录时,它会出现两次 – Vahid