带占位符的模糊查询、CLOB类型的模糊查询

1.带占位符?的模糊查询:
比如查询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());

2.CLOB类型的模糊查询:
在开发中经常会遇到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 ?";//适合大多数数据库,首选方法

3.CLOB类型的精确查询:
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,只不过是匹配的字符串中的通配符不同而已。

你可能感兴趣的:(java,oracle)