问题的提出:请看下面的SQL语句:
select *
from (select rownum r_id, t_tmp.*
from (select p.*,
o.NAME_ZH,
o.NAME_EN,
o.NAME_JP,
o.ORG_DESC_ZH,
o.ORG_DESC_EN,
o.ORG_DESC_JP,
c.name_zh city_name_zh,
c.name_en city_name_en,
c.name_jp city_name_jp,
d.name_zh district_name_zh,
d.name_en district_name_en,
d.name_jp district_name_jp,
r.name_zh country_name_zh,
r.name_en country_name_en,
r.name_jp country_name_jp,
a.name_zh area_name_zh,
a.name_en area_name_en,
a.name_jp area_name_jp,
decode(t.propid,, 0, 1) isKeyHotel,
decode(s.propid,, 0, 1) isExchangeRateSet
from t_prop p,
t_city c,
t_country r,
t_district d,
t_area a,
T_PROPORG o,
t_keyhotel t,
t_prop_exchangerate_set s
where 1 = 1
and (p.prop = :1 or p.prop = :2 or p.prop = :3 or
p.prop = :4 or p.prop = :5 or p.prop = :6 or
p.prop = :7 or p.prop = :8 or p.prop = :9 or
p.prop = :10 or p.prop = :11 or p.prop = :12 or
p.prop = :13 or p.prop = :14 or p.prop = :15 or
p.prop = :16 or p.prop = :17 or p.prop = :18 or
p.prop = :19 or p.prop = :20 or p.prop = :21 or
p.prop = :22 or p.prop = :23 or p.prop = :24 or
p.prop = :25 or p.prop = :26 or p.prop = :27 or
p.prop = :28 or p.prop = :29 or p.prop = :30 or
p.prop = :31 or p.prop = :32 or p.prop = :33 or
p.prop = :34 or p.prop = :35 or p.prop = :36 or
p.prop = :37 or p.prop = :38 or p.prop = :39 or
p.prop = :40 or p.prop = :41 or p.prop = :42 or
p.prop = :43 or p.prop = :44 or p.prop = :45 or
p.prop = :46 or p.prop = :47 or p.prop = :48 or
p.prop = :49 or p.prop = :50 or p.prop = :51 or
p.prop = :52 or p.prop = :53 or p.prop = :54 or
p.prop = :55 or p.prop = :56 or p.prop = :57 or
p.prop = :58 or p.prop = :59 or p.prop = :60 or
p.prop = :61 or p.prop = :62 or p.prop = :63 or
p.prop = :64 or p.prop = :65 or p.prop = :66 or
p.prop = :67 or p.prop = :68 or p.prop = :69 or
p.prop = :70 or p.prop = :71 or p.prop = :72 or
p.prop = :73 or p.prop = :74 or p.prop = :75 or
p.prop = :76 or p.prop = :77 or p.prop = :78 or
p.prop = :79 or p.prop = :80 or p.prop = :81 or
p.prop = :82 or p.prop = :83 or p.prop = :84 or
p.prop = :85 or p.prop = :86 or p.prop = :87 or
p.prop = :88 or p.prop = :89 or p.prop = :90 or
p.prop = :91 or p.prop = :92 or p.prop = :93 or
p.prop = :94 or p.prop = :95 or p.prop = :96 or
p.prop = :97 or p.prop = :98 or p.prop = :99 or
p.prop = :100 or p.prop = :101 or p.prop = :102 or
p.prop = :103............................
.. or p.prop = :5443)
and p.countryid = r.countryid(+)
and p.cityid = c.cityid(+)
and p.areaid = a.areaid(+)
and p.districtid = d.districtid(+)
and p.ORGID = o.ORGID(+)
and p.prop = t.propid(+)
and p.prop = s.propid(+)
order by to_number(p.PROP)) t_tmp
where rownum <= :5444)
where r_id >= :5445
开始解决问题:用了类似如上的直接连数据库的试验代码发现和我们想像的一样,感觉这个问题很容易解决,就直接在forcore里面进行修改,因为forcore里面配置的是连接池,于是就出现了问题,一会可以看到我们我们插入的数据,一会看不到我们插入的数据,这是由于每次用的连接池的连接不一样所致,而且连接池中的连接是不会销毁完的,经过反复试验和在网上查找相关资料,我们也没有办法保证我们用时只用一个连接,每次不让连接池给我们取不同的连接。在我们的 forcore中DAO实现类中一般的代码如下:
public List selectAdminWorkArea(String classId){
List list = new ArrayList();
list = (List)getSqlMapClientTemplate().queryForList("tp.selectAdminWorkArea");
return list;
}
我们开始的时候,把它变为如下以运用临时表:
public List selectAdminWorkArea(String classId){
List list = new ArrayList();
getSqlMapClientTemplate().insert("tp.insertAdminWorkArea", classId);//多了一个插入数据的部分
list = (List)getSqlMapClientTemplate().queryForList("tp.selectAdminWorkArea");
return list;
}
多出的部分是我们用来向临时表里插入数据,下面的语句是用来和临时表联合进行查询,我们的临时表用的是会话级的,按我们的想法,这样用就可以了,可是发现我们插入的数据,在我们下面取的时候根本看不到,因为可能每用一个getSqlMapClientTemplate(),他就会取一个不同的连接,后来我们把他改为如下:
public List selectAdminWorkArea(String classId){
List list = new ArrayList();
SqlMapClient sqlMapClient = this.getSqlMapClient();
sqlMapClient.insert("tp.insertAdminWorkArea", classId);
list = (List)sqlMapClient.queryForList("tp.selectAdminWorkArea");
return list;
}
这样改了以后还是不行,我们有点陷入困境,后来想想给他弄个事务,看会是我们想要的不,于是又改为如下:
public List selectAdminWorkArea(String classId){
List list = new ArrayList();
SqlMapClient sqlMapClient = this.getSqlMapClient();
try{
sqlMapClient.startTransaction();
sqlMapClient.insert("tp.insertAdminWorkArea", classId);
list = (List)sqlMapClient.queryForList("tp.selectAdminWorkArea");
sqlMapClient.endTransaction();
}catch(Exception e){
System.out.println(e.getMessage());
}
return list;
}