今天一直在做“病人退出”随访内容(或者该称为业务)。何谓病人退出?就是病人由于死亡,痊愈,转归等原因退出随访计划,因此,在做这个内容的时候,不仅跟其他随访计划一样,要有增删查改的接口,而且要实现“退出”这一功能。
增删查改这个好说,跟其他随访计划没有什么两样,倒是“退出”这一功能,着实让我为难了一会。
现在系统中,想要增加随访计划,首先要查询得到会员名单,选择会员,进而选择要创建的随访计划,最后是发布。因此,要想一个病人退出后不能再创建该病人的随访计划,必须在名单上做文章。
由于现在系统中大部分数据表已经建好,不可能修改已有的数据表,因此,打算新建一个表,主键跟病人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;
}
... {
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;
}
DetachedCriteria dc
=
DetachedCriteria.forClass(VMember.
class
);
……
dc.add(Expression.in(VMember.PROP_ID,QueryNotExit()));
……
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)看起来也没什么问题。但是因为我的数据库数据非常大,我运行的时候就发生了堆栈错误!
能有什么方法解决呢?我还没想到,希望明天可以解决这个问题,或者有哪位朋友有好的方法,可以回一个!