Mysql HQL具有3个表的联接和where条件
我们有一个生成HQL的报告,其中两个表之间的连接工作正常。但是随着DB设计的改变,我们现在需要对3个表做同样的事情。但是我没有得到想要的结果 之前,所有用户在系统中都有一个角色,该角色是用户表的一部分。在这种情况下,以下HQL工作正常Mysql HQL具有3个表的联接和where条件,mysql,sql,hibernate,hql,Mysql,Sql,Hibernate,Hql,我们有一个生成HQL的报告,其中两个表之间的连接工作正常。但是随着DB设计的改变,我们现在需要对3个表做同样的事情。但是我没有得到想要的结果 之前,所有用户在系统中都有一个角色,该角色是用户表的一部分。在这种情况下,以下HQL工作正常 <![CDATA[SELECT new com.test.reportsmodel.agentReport(u, COUNT( t.transactionId ), SUM(CASE WHEN t.sta
<![CDATA[SELECT new com.test.reportsmodel.agentReport(u,
COUNT( t.transactionId ), SUM(CASE
WHEN t.status = 'CREATED' THEN 1
WHEN t.status = 'PAID' THEN 1
WHEN t.status = 'DELIVERED' THEN 1
ELSE 0 END ))
FROM User AS u
LEFT JOIN u.transactionsForAgent t WITH
(t.invoiceDate BETWEEN :startDate AND :endDate)
WHERE u.role = 'EXTERNALAGENT'
GROUP BY u.userId]]>
现在数据库设计已经改变,允许用户在系统中扮演多个角色。因此,已经创建了useraccess表,其中包含userId和角色。为应对变更,上述HQL已更新为
<![CDATA[SELECT new com.test.reportsmodel.agentReport(u,
COUNT( t.transactionId ), SUM(CASE
WHEN t.status = 'CREATED' THEN 1
WHEN t.status = 'PAID' THEN 1
WHEN t.status = 'DELIVERED' THEN 1
ELSE 0 END ))
FROM User AS u
LEFT JOIN u.transactionsForAgent t WITH
(t.invoiceDate BETWEEN :startDate AND :endDate)
LEFT JOIN u.useraccesses a WITH
(a.role = 'EXTERNALAGENT')
GROUP BY u.userId]]>
但是这个查询没有给出正确的结果。由于角色的变化,有相当多的HQL需要修改。我想了解在HQL中加入此更改的最佳方式。结果在哪方面是错误的?@carbontax使用相同的数据和表中的更改,新报告有不同的数字。我没有对行数等进行完整分析。您需要进行更多分析。你的火柴打错了吗?重复行?不要让我们猜测。我可以找到问题,带有useraccess的连接应该是内部连接,而不是左连接,以便与角色完全匹配。这一变化似乎解决了这个问题。