要重做一个系统,以前那个系统因为查询效率非常低下,所以要重做。
查询需求比较蛋疼:查询的字段,和查询条件都是要动态拼接的。因为之前的做法是把所有要显示的字段和查询的条件都写在一个视图里,查询的时候直接拼接where 条件就行了。基础视图查询了太多的字段(很多字段还是用了函数),关联了太多的表,倒是几乎没子查询。
现在他们想把基础视图简化,只查列表显示的常用字段,然后查询时去动态的拼表连接JOIN和WHERE条件,我想了半天也没想出来应该怎么做。主要就是,查询条件来自不同的表,以前可以直接拼field1 = ? And field2 in (?,?...),可是现在fields都在了不同的表,怎么办呢?谁能提供一个好思路,谢了!
可以用ibatis框架来做,将改变的值来作为参数进行传递。并且在ibatis里,可以根据条件来添加where字句中的约束
你已经说了透过join
select a.id,b.name
form atable a , btable b
where a.id=b.id and b.name='xxx'
朋友你好,你们的系统持久化层是否用的是hibernate?由于hibernate使用的是hql,在sql上不怎么灵活,不过也是有优点的,就是不怎么要求sql很熟练。但在一些复杂的sql或动态sql拼接上却显得是否乏力。如果你们是要全部重做系统,而不只是在原有的基础上去维护的话,建议改用Mybatis作为持久化层,正如一楼所说,支持条件选择分支,对SQL的支持就更加灵活,而且后期也已于调试和维护SQL。如果实在是需要用原来的持久化层,我建议你最好问一下公司里面比较有经验的同道,比你来这上面提问效率会更加快捷一些。在公司,第一时间把问题抛出来,往往比一个人在那琢磨很久要有利得多。即便后者能够让你自己获得提升,但无疑会影响项目进度,会让人产生一种你是个不懂得沟通协作的人的错觉。^_^
可以试下,前台传递的不再是field1 ,而是table.field1 这样就可以获取到table和filed1,然后拼接sql语句。
select a.name,b.dep,c.age from a join b on a.dep_id=b.id join c on a.age_id=c.id where a.name like '%xx'