Jfinal sql问题

  1. 波总,请教下,你像这种类型的sql,如何在Jfinal中拼接好些,sql如下:

  2. select dqbm,a.yybm, dqmc,yymc,ypid,ypmc,je,b.zje,a.yzys,round(je / b.zje * 100, 3) bl, :zt 

  3. from  (select  max(dqbm) dqbm,max(dqmc) dqmc,yybm,max(yymc)yymc,ypid,max(ypmc) ypmc,yzys,sum(sl),sum(je) je from ZY_DPZYLCDYSJK  

  4. where dpz_bz=1 and rq >= :rq1 and rq <= :rq2 and  ((yybm = :yybm and :yybm<> '0')or (:yybm = '0' and 1 = 1))  

  5. and  ((dqbm = :dqbm and :dqbm<> '0')or (:dqbm = '0' and 1 = 1)) and ((lx = :lx and :lx<> '2')or (:lx = '2' and 1 = 1)) 

  6.  group by yzys ,ypid,yybm) a ,


  7. (select  yzys,yybm,sum(je) zje from ZY_DPZYLCDYSJK 

  8. where rq >= :rq1 and rq <= :rq2 and  ((yybm = :yybm and :yybm<> '0')or (:yybm = '0' and 1 = 1))  

  9. and  ((dqbm = :dqbm and :dqbm<> '0')or (:dqbm = '0' and 1 = 1))  and ((lx = :lx and :lx<> '2')or (:lx = '2' and 1 = 1)) 

  10.  group by yzys ,yybm) b 


  11. where  a.yzys=b.yzys  and a.yybm=b.yybm   


评论区

JFinal

2016-08-18 11:39

sql 比较长,可以放在外部文件中,然后使用 Sqls.java 这个工具类来加载使用。注意 Sqls 这个工具类是支持的 key=value 形式的配置,多行 sql 使用 "\"字符结尾来实现换行,例如:
accountListSql = select * from account \
where accountId=? \
and age > 18
对于以上这类有很多行的 sql,放在外部文件就不存在拼接的问题,直接书写就好。

此外,有些 sql 可能需要动态生成有些变动的项目,此时可以用一下类似于 freemarker的模板来写点代码来生成动态部,最好是先建一个 FreemarkerKit 工具类

JFinal

2016-08-18 11:40

补充一下 Sqls 的使用方法:
find(Sqls.get("accountListSql"), p1, p2, ..., pn);

lyh061619

2016-08-18 12:30

@JFinal 谢谢波总。

lyh061619

2016-08-18 12:31

@JFinal 现在搞MIS统计类的报表,sql是挺长的,这些字段是通过存储过程生成后的数据结果表了,要不然更长了。

JFinal

2016-08-18 12:52

@lyh061619 用 jfinal 的 Db + Record 做统计查询极度顺爽,要是用别的技术得累死人

lyh061619

2016-08-18 12:54

@JFinal 波总下个版本,在这块是不是有更大的惊喜着呀,目前版本ORM设计对项目开发这块效率不是很高。哈哈!

JFinal

2016-08-18 12:55

@lyh061619 目前版本的 ORM 开发效率已经非常高了,难道你能找到有比这更高效的?

lyh061619

2016-08-18 14:33

@JFinal 这个分页查询是挺难用的,还有就是刚才波总提到的动态参数支持这块了,现在是这样拼接着。 sql.append(" from ZY_DPZYLCDYSJK");

if (!xx.isEmpty(objs[0])) { //医院编码
if (Const.Si.CODE.equals(objs[0]) || Const.Si.DOT.equals(objs[0])) {
sql.append(" where 1=1 and dpz_bz=1");
} else {
sql.append(" where yybh like '"+objs[0]+"%' and dpz_bz=1");
// paras.add(objs[0]);
}
}
if (!xx.isEmpty(objs[1])) { //查询日期
sql.append(" and to_char(rq, 'yyyy-MM-dd') >= '"+objs[1]+"'");
// paras.add(objs[1]);
}
if (!xx.isEmpty(objs[2])) {
sql.append(" and to_char(rq, 'yyyy-MM-dd') <= '"+objs[2]+"'");
// paras.add(objs[2]);
}
if (!xx.isEmpty(objs[3])) { //医生类型;1门诊;2住院
sql.append(" and lx >= '"+objs[3]+"'");
// paras.add(objs[3]);
}
if (!xx.isEmpty(objs[4])) { //监控比例
sql2.append(" and bl > '"+objs[4]+"'");
// paras.add(objs[4]);
}

if (Const.Si.CODE.equals(objs[0]) || Const.Si.DOT.equals(objs[0])) { //全部/全市查询
if (ir.equals("0")) { //基本
select = "";
sql.append("");
res = Db.use(xx.Ds.BS2).paginate(pageNum, pageSize, true, select, sql.toString(), paras.toArray()).getList();
} else if (ir.equals("1")) { //明细
select = "select dqbm,a.yybm, dqmc,yymc,ypid,ypmc,je,b.zje,a.yzys,round(je / b.zje * 100, 3) bl";
from = " from (select max(dqbm) dqbm,max(dqmc) dqmc,yybm,max(yymc)yymc,ypid,max(ypmc) ypmc,yzys,sum(sl),sum(je) je" +
" from ZY_DPZYLCDYSJK " + sql.toString()+ " group by yzys ,ypid,yybm) a ," +
" (select yzys,yybm,sum(je) zje from ZY_DPZYLCDYSJK" + sql.toString() + " group by yzys ,yybm) b" +
" where a.yzys=b.yzys and a.yybm=b.yybm" + sql2.toString();
res = Db.use(xx.Ds.BS2).paginate(pageNum, pageSize, select, from).getList();
}

热门反馈

扫码入社