[color=blue]1.带占位符?的模糊查询:[/color]
比如查询t_name字段中包含变量name的记录:
[color=blue]2.CLOB类型的模糊查询:[/color]
在开发中经常会遇到CLOB类型数据的模糊查询(比如remark的模糊查询等),解决方法如下:
下面这种方式可以适用于大多数数据库,是首选:
[color=blue]3.CLOB类型的精确查询:[/color]
比如查询t_name字段中包含变量name的记录:
List<Object> params = new ArrayList<Object>();
params.add("%" + name + "%");
String hql = "select t from Person t where t.t_name like ?";
List<Person> list = service.getPersonByHql(hql,params.toArray());
[color=blue]2.CLOB类型的模糊查询:[/color]
在开发中经常会遇到CLOB类型数据的模糊查询(比如remark的模糊查询等),解决方法如下:
params.add(remarkStr);
String hql = "select t from Person t where dbms_lob.instr(t.remark, ?,1,1)> 0";//只适用于Oracle数据库
补充:Oracle数据库中DBMS_LOB.instr函数用于从指定的位置开始,从clob中查找第N个与模式匹配的字符串;
Oracle数据库中DBMS_LOB.substr函数用于从clob中抽取指定长度的字节,再转为字符串。例子:DBMS_LOB.substr(remark,4000,1)
DBMS_LOB的instr与substr讲解:http://ifindit.blog.sohu.com/163919197.html
http://blog.csdn.net/swordmanwk/article/details/6204611
下面这种方式可以适用于大多数数据库,是首选:
params.add("%" + remarkStr+ "%");
String hql = "select t from Person t where t.remark like ?";//适合大多数数据库,首选方法
[color=blue]3.CLOB类型的精确查询:[/color]
params.add(remarkStr);
//String hql = "select t from Person t where t.remark = ?";//错误!!!切记切记
String hql = "select t from Person t where t.remark like ?";//正确!这里用了点转换:就是灵活运用了like,精确查询时,就让它全部匹配传进来的参数
总结:对于CLOB类型数据的模糊查询以及精确查询都可以用like,只不过是匹配的字符串中的通配符不同而已。