锁定老帖子 主题:数据库动态查询最佳实现
该帖已经被评为新手帖
|
|
---|---|
作者 | 正文 |
发表时间:2009-04-08
42087743 写道 越来越不了解javaeye的大牛了,是不是确实自己太牛了......
这种帖子被评为新手帖,确实是太过分了,你们应该明白逛javaeye的大部分人都没有你们那么牛,所以请你们手下留情点吧..... 人家辛辛苦苦地写了那么多,你们评为新手帖,确实是太打击人的积极性了,这样下去,javaeye的技术论坛不会再有人发帖子了,大家都去泡海阔天空吧 确实委屈了楼主,楼主也是为大家分享,提出自己的见解,还是可以借鉴学习的!新手贴台委屈了! |
|
返回顶楼 | |
发表时间:2009-04-08
42087743 写道 越来越不了解javaeye的大牛了,是不是确实自己太牛了......
这种帖子被评为新手帖,确实是太过分了,你们应该明白逛javaeye的大部分人都没有你们那么牛,所以请你们手下留情点吧..... 人家辛辛苦苦地写了那么多,你们评为新手帖,确实是太打击人的积极性了,这样下去,javaeye的技术论坛不会再有人发帖子了,大家都去泡海阔天空吧 不是JE的大牛都太牛了,是这个本不算创新,在JE发技术帖最好先确定要发的这个东西是不是新课题. 而说成是什么陈氏什么什么法,有些言过其实了. |
|
返回顶楼 | |
发表时间:2009-04-08
大家都是报复性质的投新手帖啊!
|
|
返回顶楼 | |
发表时间:2009-04-08
最后修改:2009-04-08
elam 写道 42087743 写道 越来越不了解javaeye的大牛了,是不是确实自己太牛了......
这种帖子被评为新手帖,确实是太过分了,你们应该明白逛javaeye的大部分人都没有你们那么牛,所以请你们手下留情点吧..... 人家辛辛苦苦地写了那么多,你们评为新手帖,确实是太打击人的积极性了,这样下去,javaeye的技术论坛不会再有人发帖子了,大家都去泡海阔天空吧 不是JE的大牛都太牛了,是这个本不算创新,在JE发技术帖最好先确定要发的这个东西是不是新课题. 而说成是什么陈氏什么什么法,有些言过其实了. 怎么才算创新呢?之前有类似简洁的做法吗?首先要说明的是我绝对没有借鉴JE上的任何人的做法,我的想法来自ibatis(去阿里面试时以前同事介绍ibatis时突然让我产生了灵感)以及对大家编程过程中的如何简化的思考! 我想有时候微小的进度都是巨大的进步,你不信在我基础上你看还能有多少改进,而相对之前的JE上人的做法我这个进度又是多大,就好比cpu一样core2比core1按你说也不是什么创新,因为还是cpu呀,哈哈! 我不太想回复了!你们要是觉得在没有看我这个之前有更简单的做法你就露一手让大家看看,我可以自信的说,没有!不要总吹嘘了,好就是好,不好就是不好,给句公道话,不服就把所谓你们先进的做法拿出来让大家评,请用事实说话! 所以我说是陈氏查询一点都不过份!现实是我们团队用了这个代码简化了很多,维护起来也方便了,我们原先的做法其实并不比大家的差,但改进的感觉是巨爽的,如果对每个团队都有这样的提升,命名为陈氏查询又有何过之有,有什么不妥呢,这是对原创的尊重! |
|
返回顶楼 | |
发表时间:2009-04-08
最后修改:2009-04-08
QuakeWang 写道 zhongxuchen 写道 第一:and和换行这就严重约束了sql语句的写法,必须严格按照你的约定来换行,否则就完蛋。其实你根本就没有考虑一些特殊问题比方 #[t.date>=:begindate and t.date<=:enddate],这个只要有一个为null整体都得拿掉,还有很多类似的问题,你的做法限制过于苛刻,这样用反而成了累赘。 你没有明白我说的意思,具体来说: 你这个例子在开头没有and 或者 or,是不正确的查询,完整的应该类似: select * from table_name t where 1 = 1 #[and t.date >= :begindate and t.date <= :enddate] #[or t.status = :status] 按照我建议的更简化约定来写,就需要写成 select * from table_name t where 1 = 1 and t.date >= :begindate and t.date <= :enddate or t.status = :status 这个lib在读到以and和or开头的行,就可以进行是否要动态拼接的判断,和你用#[]来判断是一样的,你说的整体拿掉,原先代码是拿掉#[]之间的,这里是拿掉整行,也是等价的。 而好处是更简化:先在sql客户端进行复杂的组合sql调试,然后复制过来按这个约定进行排版,无需在每行开头加#[,在结尾加]。 缺点有一些,比如有固定参数的,我们得先写在一行,或者加个空格: select * from table_name t where 1 = 1 and t.date > '20000101' and t.date >= :begindate and t.date <= :enddate and t.status <> 'delete' 但是正如你所说,能够让95%的代码写起来更轻松,另外5%加一些限制也无所谓,这只是看如何取舍的问题。 我的#[]支持嵌套,sql或hql可以写成这样 select * from table_name t where 1 = 1 #[and t.status=:status and t.orderId=(select orderId from t2 #[where t2.name like :name]] and t.date>=:date #[]只需要在需要判断为null的地方加,并不一定所有的地方都要加! 用换行是否可以呢?我决定不想再解释我的这个东西了! |
|
返回顶楼 | |
发表时间:2009-04-09
你还是需要继续解释的,光写一个嵌套语句在那边,我不太明白想要实现的结果是什么。
首先你的子查询少了一个右括号,我猜测正确的写法应该是? select * from table_name t where 1 = 1 #[and t.status=:status and t.orderId=(select orderId from t2 #[where t2.name like :name])] 其次,你需要解释一下,这种嵌套在不同参数下面会产生什么样的语句,比如: 1. 什么参数都不传,是产生A还是B? A. select * from table_name t where 1 = 1 B. select * from table_name t where 1 = 1 and t.orderId=(select orderId from t2) 2. 如果只传递了name参数,是产生前面中的A还是这样: select * from table_name t where 1 = 1 and t.orderId=(select orderId from t2 where t2.name like :name) 3. 只传递status参数又会产生什么样的语句? 其实我想弄明白的是这个嵌套对于外层和内层的变量是否有优先级,比如外层的变量没有传递,是否就不管内层所有的语句? 不论你选择的是那种策略,还是可以用等价的and/or开头,换行结尾来替换: select * from table_name t where 1 = 1 and t.status = :status and t.orderId = (select orderId from t2 where 1 = 1 and t2.name like :name ) select * from table_name t where 1 = 1 and t.status = :status and t.orderId = (select orderId from t2 where 1 = 1 and t2.name like :name) |
|
返回顶楼 | |
发表时间:2009-04-09
最后修改:2009-04-09
QuakeWang 写道 你还是需要继续解释的,光写一个嵌套语句在那边,我不太明白想要实现的结果是什么。
首先你的子查询少了一个右括号,我猜测正确的写法应该是? select * from table_name t where 1 = 1 #[and t.status=:status and t.orderId=(select orderId from t2 #[where t2.name like :name])] 其次,你需要解释一下,这种嵌套在不同参数下面会产生什么样的语句,比如: 1. 什么参数都不传,是产生A还是B? A. select * from table_name t where 1 = 1 B. select * from table_name t where 1 = 1 and t.orderId=(select orderId from t2) 2. 如果只传递了name参数,是产生前面中的A还是这样: select * from table_name t where 1 = 1 and t.orderId=(select orderId from t2 where t2.name like :name) 3. 只传递status参数又会产生什么样的语句? 其实我想弄明白的是这个嵌套对于外层和内层的变量是否有优先级,比如外层的变量没有传递,是否就不管内层所有的语句? 不论你选择的是那种策略,还是可以用等价的and/or开头,换行结尾来替换: select * from table_name t where 1 = 1 and t.status = :status and t.orderId = (select orderId from t2 where 1 = 1 and t2.name like :name ) select * from table_name t where 1 = 1 and t.status = :status and t.orderId = (select orderId from t2 where 1 = 1 and t2.name like :name) 你说的没错,是少了一个括号,随便写个例子大意了! 如果status为null,就会是 select * from table_name t where 1 = 1 如果status不为null,name为nul则 select * from table_name t where 1 = 1 and t.status=:status and t.orderId=(select orderId from t2) 这些可以根据你实际的情况自己决定怎么做,用换行我想肯定是做不到的 |
|
返回顶楼 | |