ibatis生成的SQL语句在plsql中运行正常,排序也正常,但是ibatis自己返回的结果集却排序不正确
控制台打印的SQL运行信息:
{pstm-100133} Executing Statement: select t.*,org.organ_name,citizen.name,citizen.date_of_birth from ( select * from ( select row_limit.*, rownum rownum_ from ( select * from( select inorders.org_id,inorders.mpi_id,inorders.dept_admission_to,inorders.discharge_dept_name,inorders.master_doctor_name, inorders.admission_date,inorders.discharge_date,inorders.in_days,inorders.diagnosis,inorders.in_fee,inorders.ehr_id from t_log_in_orders inorders where inorders.discharge_date >= ? and inorders.discharge_date <= ? and inorders.in_fee is not null order by inorders.in_fee desc) where rownum<=? ) row_limit where rownum <= ? ) where rownum_ >= ? )t left join t_organization org on t.org_id = org.organ_code left join t_citizen_info citizen on citizen.mpi_id = t.mpi_id
{pstm-100133} Parameters: [20120101, 20120902, 10, 10, 1]
{pstm-100133} Types: [java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String]
{rset-100134} ResultSet
{rset-100134} Header: [ORG_ID, MPI_ID, DEPT_ADMISSION_TO, DISCHARGE_DEPT_NAME, MASTER_DOCTOR_NAME, ADMISSION_DATE, DISCHARGE_DATE, IN_DAYS, DIAGNOSIS, IN_FEE, EHR_ID, ROWNUM_, ORGAN_NAME, NAME, DATE_OF_BIRTH]
{rset-100134} Result: [690482894, 15681, 血液、肿瘤内科, 血液、肿瘤内科, 李丹, 20120227, 20120329, 32, 肺部感染, 106233, 24288814, 10, 第一人民医院, 曾集传, 19251214]
{rset-100134} Result: [690482894, 23083, 骨外科, 神经外科, 刘伟乐, 20120102, 20120207, 37, 肺部感染, 113280, 24225345, 8, 第一人民医院, 蔡晓青, 19840412]
{rset-100134} Result: [690482894, 27831, 急诊内科, 危重医学科, 叶自力, 20120131, 20120215, 16, 泌尿系感染, 317114.97, 24233413, 2, 第一人民医院, 刘华生, 19330220]
{rset-100134} Result: [690482894, 27831, 急诊内科, 危重医学科, 叶自力, 20120131, 20120215, 16, null, 317114.97, 24233413, 1, 第一人民医院, 刘华生, 19330220]
{rset-100134} Result: [690482894, 27209, 急诊内科, 神经外科, 余名华, 20120130, 20120214, 16, 无, 122871, 24232310, 7, 第一人民医院, 叶新健, 19760220]
{rset-100134} Result: [690482894, 29131, 肾病、风湿病科, 危重医学科, 车雁芳, 20120102, 20120217, 47, 肺部感染, 235345, 24235644, 3, 第一人民医院, 欧阳骝, 19271226]
{rset-100134} Result: [690482894, 43596, 神经外科, 神经外科, 谢乙团, 20120202, 20120310, 38, 泌尿道感染, 142203, 24261147, 5, 第一人民医院, 陈贵华, 19560816]
{rset-100134} Result: [690482894, 40882, 普外科, 普外科, 肖凌晖, 20120221, 20120306, 15, 无, 109664.6, 24256059, 9, 第一人民医院, 张月开, 19360306]
{rset-100134} Result: [690482894, 40885, 危重医学科, 综合内科, 陈海龙, 20120201, 20120306, 35, 无, 123344, 24256066, 6, 第一人民医院, 许富来, 19300106]
{rset-100134} Result: [690482894, 46436, 神经外科, 神经外科, 曾春生, 20120228, 20120314, 16, 无, 151928, 24266678, 4, 第一人民医院, 江秀琴, 19580629]
把参数替换问号组成SQL语句:
select t.*,org.organ_name,citizen.name,citizen.date_of_birth from ( select * from ( select row_limit.*, rownum rownum_ from ( select * from( select inorders.org_id,inorders.mpi_id,inorders.dept_admission_to,inorders.discharge_dept_name,inorders.master_doctor_name, inorders.admission_date,inorders.discharge_date,inorders.in_days,inorders.diagnosis,inorders.in_fee,inorders.ehr_id from t_log_in_orders inorders where inorders.discharge_date >= '20120101' and inorders.discharge_date <= '20120902' and inorders.in_fee is not null order by inorders.in_fee desc) where rownum<='10' ) row_limit where rownum <= '10' ) where rownum_ >= '1' )t left join t_organization org on t.org_id = org.organ_code left join t_citizen_info citizen on citizen.mpi_id = t.mpi_id
在plsql中查看执行结果:
69048289427831急诊内科危重医学科叶自力201201312012021516317114.97242334131第一人民医院刘华生19330220
69048289427831急诊内科危重医学科叶自力201201312012021516泌尿系感染317114.97242334132第一人民医院刘华生19330220
69048289429131肾病、风湿病科危重医学科车雁芳201201022012021747肺部感染235345.00242356443第一人民医院欧阳骝19271226
69048289446436神经外科神经外科曾春生201202282012031416无151928.00242666784第一人民医院江秀琴19580629
69048289443596神经外科神经外科谢乙团201202022012031038泌尿道感染142203.00242611475第一人民医院陈贵华19560816
69048289440885危重医学科综合内科陈海龙201202012012030635无123344.00242560666第一人民医院许富来19300106
69048289427209急诊内科神经外科余名华201201302012021416无122871.00242323107第一人民医院叶新健19760220
69048289423083骨外科神经外科刘伟乐201201022012020737肺部感染113280.00242253458第一人民医院蔡晓青19840412
69048289440882普外科普外科肖凌晖201202212012030615无109664.60242560599第一人民医院张月开19360306
69048289415681血液、肿瘤内科血液、肿瘤内科李丹201202272012032932肺部感染106233.002428881410第一人民医院曾集传19251214
很显然这两个结果集的顺序不一样,排在第一位的
在控制台打印的是:
[690482894, 15681, 血液、肿瘤内科, 血液、肿瘤内科, 李丹, 20120227, 20120329, 32, 肺部感染, 106233, 24288814, 10, 第一人民医院, 曾集传, 19251214]
而在PLSQL中输出运行,排在第一位的是:
69048289427831急诊内科危重医学科叶自力201201312012021516317114.97242334131第一人民医院刘华生19330220
实在是让我很费解,请大虾帮忙分析分析,小弟不胜感激!
[解决办法]
可能是你直接都用字符串代替参数值的原因,你的 inorders.discharge_date 是日期型还是varchar类型,如果日期型应该改为 to_date('20120101','yyyymmdd')
另外rownum <= '10' 也应该改为 rownum <= 10 ,其他的类似