String sql = " select * from user where category = ? ...."大概说明一下:sql 是一个字符串、我想获取到 category 等号后面的值、 是动态 .....代表不定参数 意思是后面也不一定多加条件来查询、且 sql 每个字符串的中间的空格多少也不固定、求获得到 ? 的值用indexOf subString 效果都不是那么好、先谢谢了
String sql = " select * from user where category = ? ...."大概说明一下:sql 是一个字符串、我想获取到 category 等号后面的值、 是动态 .....代表不定参数 意思是后面也不一定多加条件来查询、且 sql 每个字符串的中间的空格多少也不固定、求获得到 ? 的值用indexOf subString 效果都不是那么好、先谢谢了
=========================你直接匹配 "=\\s*\\d+\\s+" 怎么样
for example
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);
where mycategory = 100或者:
select *
from tableA a, table B b
where a.mycategory=b.yourcategory
不过唯一的缺陷就是 hibernate在转换sql 的时候 会把我0101001这样的字符串改成101001(为了获取参数我没用防注入sql语句 ,直接拼接字符串)这样我的sql语句就变成了String sql = "select * from user where category = 'someValue' and xxx = yyy ...";这样正则就要换换了、而我对正则比较弱噢、不好意思麻烦您了
而数据库里有多个分表、内容字段都跟主表一样、定义成:User_01 。等等我查询的时候查主表、然后就根据我那篇求助 拦截hibernate的 sql语句进行偷换、把hibernate的 onPrepareStatement 重载。进行表偷换、在返回给数据库执行去、比如我查个01表 我直接去查主表的hql语句、然后偷换表名为 User_01 这样hibernate也返回成User的实体组装、我一直都在窃喜hibernate好傻、 中间偷换了东西 数据库和hibernate都不知道、
不过后来发现我傻x了、绑定语句时候获取不到参数。都是?的值、
被逼无奈、 简单查询就不用防注入的sql语句、而是直接后面加上参数、
其他的比如保存 就暂时没什么办法、
看样子是在做大型数据表,其实Oracle的表分区技术能够比较好的支持这种需求了,把category作为分区字段即可。一般来说如果不是分库(物理上多个数据库,每个数据库承担一个或多个子表的运算),其实更推荐用分区技术。前阵子Taobao的工程师就提及他们采用了物理分库,不过他们直接重新包装了数据访问组件,根据参数值选择数据库连接;这个动作就大多了。
最后此种方式无疾告终:原因贴:http://topic.csdn.net/u/20120518/09/b41ead16-471f-4e7d-bcfd-fabbaaed9f02.html?45705最后可能要另寻出路了、顺带说下、我们没有DBA、小公司、需要自己学分区了看来、
或许另一个出路是:自己包装HibernateTemplate,也即代理模式。直接在:hibernateTemplate.execute() 这个级别,完成所有想干的坏事。反正你也是用的Spring框架,动态代理、拦截 之类的要做到并非难事,想想看Spring提供的事务控制就是用的这种模式。