Hibernate - 简单数据但复杂的SQL查询

时间:2016-04-25 13:55:35

标签: sql sql-server hibernate hql

我需要使用Hibernate进行hql / sql查询,但我不确切知道如何在Hibernate中实现这一点。后端数据库是SQL Server。

我有主要状态的交易表 - 待定,存款,清除&反弹。

交易 - 表1

Seq    Receipt ID     Status
1       1234         Pending
2       2345         Deposited
3       3456         Cleared
4       4567         Bounced

最初记录在Pending。记录的移动是from Pending to Deposit,然后是from Deposit to either Cleared or Bounced。根据对ClearedBounced的状态更改,它会在另一个表格中插入数据 - Table 2

当前正常工作的hql查询只是从Table 1读取数据,并在Table 2中查找特定收据ID的相同状态。像下面的东西

Select receiptID from Table1 where table1.status in ('Bounced','Cleared') 
and not exists (select table2.receiptID from Table2 where 
table1.receiptID = table2.receiptID and table2.status in ('Cleared','Bounced'))

到目前为止效果不错,因为在任何时候,表2中都会有Cleared or Bounced的1条记录。

新变化

现在所需的更改是在Deposit中输入Table2的记录。因此,当状态从Pending to Deposit更改时,我需要在Table2中输入数据。

现在很明显,只需在上面的查询中添加状态Deposit即可。因为它适用于Deposit,但当状态从Deposit to Cleared/Bounced更改时,系统会在Table2(子查询)中找到Deposit的现有记录,因此它赢了& #39;输入Cleared or Bounced的任何新记录。 :(

我想我可以用union来做到这一点,但不知道如何在没有任何复杂查询的情况下在Hibernate(HQL)中实现它。

帮助PLZ !!!

1 个答案:

答案 0 :(得分:0)

经过多次思考,是的,我能够找到解决方案。我只需要添加另一个不存在特定于表1的存款和表2的清除的存在条件。

新查询看起来像

Select receiptID from Table1 where table1.status in ('Deposit','Bounced','Cleared') 
        and not exists ( select table2.receiptID from Table2 
                            where table1.receiptID = table2.receiptID 
                            and   table2.status in ('Cleared','Bounced')
                            and   table1.status = table2.status )
        and not exists (select table2.receiptID from Table2
                            where table1.receiptID = table2.receiptID 
                            and   table1.status in ('Deposit'
                            and   table2.status in ('Cleared') )