日期:2014-05-19  浏览次数:20776 次

求一字符串动态截取、
Java code

String sql = " select * from user where  category = ?    ...."




大概说明一下:

sql 是一个字符串、

我想获取到 category 等号后面的值、 是动态 .....代表不定参数 意思是后面也不一定多加条件来查询、

且 sql 每个字符串的中间的空格多少也不固定、

求获得到 ? 的值

用indexOf subString 效果都不是那么好、

先谢谢了

------解决方案--------------------
如果不考虑字符串中间恰好也有个?的话,还比较好办;如果要考虑这种情况,正则也无能为力啊。

用正则另一个吐血的问题就是碰到嵌套查询的处理。
------解决方案--------------------
里面值只能是整数的、 不可能是?的 、
=========================

你直接匹配 "=\\s*\\d+\\s+" 怎么样
------解决方案--------------------
就是为了获取category等号后面的值,是吧
for example
Java code
String sql = "select * from user where  category = someValue and xxx = yyy ...";
String value = sql.replaceAll("(?i).*?category\\s*=\\s*(.*?)(\\s+.*|$)", "$1");
System.out.println(value);

------解决方案--------------------
我表示没有正确领会楼主意图,原来“category”这个字段是固定的。

不过如果遇到别名或近似名应该还是有风险的。

比如(我瞎掰,见谅): 
where mycategory = 100

或者:
select *
from tableA a, table B b
where a.mycategory=b.yourcategory


------解决方案--------------------
探讨
而数据库里有多个分表、内容字段都跟主表一样、定义成:User_01 。。。。等等

------解决方案--------------------
哥们,MySQL 5.1 也支持分区哦,虽然性能没有Oracle强悍。

http://dev.mysql.com/doc/refman/5.1/zh/partitioning.html#partitioning-hash
------解决方案--------------------
哥们再探讨下,虽然我个人更建议用分区而非程序手段。


或许另一个出路是:自己包装HibernateTemplate,也即代理模式。

直接在:hibernateTemplate.execute() 这个级别,完成所有想干的坏事。

反正你也是用的Spring框架,动态代理、拦截 之类的要做到并非难事,想想看Spring提供的事务控制就是用的这种模式。