2017-07-07 102 views
0

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

感谢您的帮助和时间

回答

0
SELECT new map(
    c.name as name, 
(CASE 
     WHEN t.status = 'open' THEN 1 
     ELSE 0 
    END) as open, 
(CASE 
     WHEN t.status = 'pending' THEN 1 
     ELSE 0 
    END) as pending, 
(CASE 
     WHEN t.status = 'closed' THEN 1 
     ELSE 0 
    END) as closed, 
    SUM(open) as openSum, 
    SUM(pending) as pendingSum, 
    SUM(closed) as closedSum 
) 
FROM 
    Ticket t 
     left join t.user u left join u.userCoordination uc left join uc.coordination c 
WHERE 
    MONTH(t.dateCreated) = :month 

// GROUP BY 1

你有过什么地段缺少上述更像是你需要什么,你需要 select new map(i.item as item...如果你跟你有什么,什么我试图做的,你可以看到为什么你有错误,比较这个基础。

不确定你的团队应该由某物组合。不确定由内部连接,如果你只是意味着一个连接,如果是这样的话,由于离开连接尝试连接并获得任何null hasMany关系等情况,所以留下所有的左连接

+0

感谢您回答@vahid。 '选择新... ...对我来说是新的。我可以看到构建查询的优点。关于这个问题,我得到一个_org.hibernate.QueryException_引起的消息:_could不能解析属性:userCoordination:ni.edu.ucc.leon.User_ – user615274

+0

我认为这是因为有一个一对多的用户和协调。我如何在查询中表达这一点?在这个位置有一个SQL小提琴:http://sqlfiddle.com/#!9/9ed08/1 – user615274

+0

@yuor第一个问题,你有'UserCoordination'我不知道你的域对象映射是什么。所以如果'User hasMany = [ucord:UserCoordination]'那将是'left join u.ucord uc'这是你在域对象中声明的映射。关于你的第二个问题,一对多是通过“左连接”来满足的,在这里某些东西是空的或者某些东西有一些价值,这将捕获所有东西。如果你从'join'中省略'left'字,那么它会列出1条记录。所以当左连接和user1有两条记录时,它会出现两次 – Vahid