病人退出与DetachedCriteria查询

今天一直在做“病人退出”随访内容(或者该称为业务)。何谓病人退出?就是病人由于死亡,痊愈,转归等原因退出随访计划,因此,在做这个内容的时候,不仅跟其他随访计划一样,要有增删查改的接口,而且要实现“退出”这一功能。
         增删查改这个好说,跟其他随访计划没有什么两样,倒是“退出”这一功能,着实让我为难了一会。
         现在系统中,想要增加随访计划,首先要查询得到会员名单,选择会员,进而选择要创建的随访计划,最后是发布。因此,要想一个病人退出后不能再创建该病人的随访计划,必须在名单上做文章。
         由于现在系统中大部分数据表已经建好,不可能修改已有的数据表,因此,打算新建一个表,主键跟病人ID号关联,另外一个键值是一个Boolean型值,是病人退出标志。在“病人退出”随访计划创建并录入数据后,更新该病人ID号对应的退出标志。有了这个退出标志,就可以根据它设置查询条件。
         初步想来,有点理所当然,实际弄起来,觉得还是挺复杂,当然啦,这是相对于我使用的方法来说。
我现在使用的方法,没有创建任何新的数据表,没有对原来系统做太大的变动,只是增加了一个查询。我只是写了一个查询函数,查询病人退出表ExitMt中已存在退出记录的病人ID号!
查询函数如下;
          public  Collection QueryNotExit()
         
{
                   Session s 
= DAOHelper.createNewSession();
 
                            Collection d
=null;
                            
try {
                                     Query q 
= s
                                     .createQuery(
"select f.memberInfo1.id from FollowupPerfInfoBt f,ExitMt e where f.id=e.followupPerform.id");             
                                     
//if want to get the members who have not exited,just modify the "=" to "!="
                                     d=q.list();
                                     
/* 测试
                                     System.err.println("    d=   "+d.size());
                                     System.err.println(d.contains(266));
                                     System.err.println(d.contains(66));
                                     System.err.println(d.contains(121));
                                     System.err.println(d.contains(3));
                                     System.err.println(d.contains(166));
                                     System.err.println(d.contains(6));
                                     
*/
                                 
                                     
return d;
                            }
 catch (Exception e) {
                                     e.printStackTrace();
                            }
 finally {
                                     DAOHelper.closeSession(s);
                            }

                            
return d;
         }

 
得到退出病人ID集后,再在原来的DetachedCriteria查询中 增加一个限制条件:
DetachedCriteria dc  =  DetachedCriteria.forClass(VMember. class );
……
dc.add(Expression.in(VMember.PROP_ID,QueryNotExit()));
个人感觉DetachedCriteria比Criteria好用,因为前者是离线创建,后者在线创建,就是方便了这么一点点。
然而,我上面的代码还是有点问题,Collection d中得到的病人ID集,是已经退出的ID号集,怎么得到还没有退出的ID号集合呢?方法目前有二:
1) 在查询函数QueryNotExit()中,where子句改成where f.id!=e.followupPerform.id;
2) 不要用Expression.notin(String arg0,Collection arg);
上述两个方法都有问题,先说方法2),很简单,notin方法不存在,至少我到现在还找不到。方法1)看起来也没什么问题。但是因为我的数据库数据非常大,我运行的时候就发生了堆栈错误!
能有什么方法解决呢?我还没想到,希望明天可以解决这个问题,或者有哪位朋友有好的方法,可以回一个!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值