String sql = " select * from user where  category = ?    ...."大概说明一下:sql 是一个字符串、我想获取到 category 等号后面的值、 是动态    .....代表不定参数   意思是后面也不一定多加条件来查询、且 sql 每个字符串的中间的空格多少也不固定、求获得到 ?  的值用indexOf subString 效果都不是那么好、先谢谢了

解决方案 »

  1.   

    里面值只能是整数的、 不可能是?的 、
    =========================你直接匹配 "=\\s*\\d+\\s+" 怎么样
      

  2.   

    就是为了获取category等号后面的值,是吧
    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);
      

  3.   

    我表示没有正确领会楼主意图,原来“category”这个字段是固定的。不过如果遇到别名或近似名应该还是有风险的。比如(我瞎掰,见谅): 
    where mycategory = 100或者:
    select *
    from tableA a, table B b
    where a.mycategory=b.yourcategory
      

  4.   


    不过唯一的缺陷就是  hibernate在转换sql 的时候 会把我0101001这样的字符串改成101001(为了获取参数我没用防注入sql语句 ,直接拼接字符串)这样我的sql语句就变成了String sql = "select * from user where  category = 'someValue' and xxx = yyy ...";这样正则就要换换了、而我对正则比较弱噢、不好意思麻烦您了
      

  5.   

    我想想、应该不会出现这种问题、我数据库有个主表、 hibernate自动生成的、 比如:User
    而数据库里有多个分表、内容字段都跟主表一样、定义成:User_01 。等等我查询的时候查主表、然后就根据我那篇求助 拦截hibernate的 sql语句进行偷换、把hibernate的 onPrepareStatement 重载。进行表偷换、在返回给数据库执行去、比如我查个01表 我直接去查主表的hql语句、然后偷换表名为 User_01  这样hibernate也返回成User的实体组装、我一直都在窃喜hibernate好傻、 中间偷换了东西 数据库和hibernate都不知道、
    不过后来发现我傻x了、绑定语句时候获取不到参数。都是?的值、
    被逼无奈、 简单查询就不用防注入的sql语句、而是直接后面加上参数、
    其他的比如保存  就暂时没什么办法、
      

  6.   


    看样子是在做大型数据表,其实Oracle的表分区技术能够比较好的支持这种需求了,把category作为分区字段即可。一般来说如果不是分库(物理上多个数据库,每个数据库承担一个或多个子表的运算),其实更推荐用分区技术。前阵子Taobao的工程师就提及他们采用了物理分库,不过他们直接重新包装了数据访问组件,根据参数值选择数据库连接;这个动作就大多了。
      

  7.   

    哥们,MySQL 5.1 也支持分区哦,虽然性能没有Oracle强悍。http://dev.mysql.com/doc/refman/5.1/zh/partitioning.html#partitioning-hash
      

  8.   

    感谢阿宝和ldh911和大家的参与、
    最后此种方式无疾告终:原因贴:http://topic.csdn.net/u/20120518/09/b41ead16-471f-4e7d-bcfd-fabbaaed9f02.html?45705最后可能要另寻出路了、顺带说下、我们没有DBA、小公司、需要自己学分区了看来、
      

  9.   

    哥们再探讨下,虽然我个人更建议用分区而非程序手段。
    或许另一个出路是:自己包装HibernateTemplate,也即代理模式。直接在:hibernateTemplate.execute() 这个级别,完成所有想干的坏事。反正你也是用的Spring框架,动态代理、拦截 之类的要做到并非难事,想想看Spring提供的事务控制就是用的这种模式。