使用jdbc出现一个神奇的问题,PreparedStatement的setString()没用了!!!

kkliuqi 2011-06-15 09:28:57
部分分页代码如下:
String sql = "select* from (select *, ROW_NUMBER() over (order by id where bookName) "+
"rowid from BookInfo where bookName like ?) temp where rowid between ? and ?";
initConnection();
try {
stmt = con.prepareStatement(sql);
stmt.setString(1, "%%"); //这句没用了,不管我传什么字符串,都set不进去,用字符串拼接可以正确的取出结果。百般不解之下来此求解,按正常来说这是不会有什么问题的,郁闷啊!!为什么这里的set不进去呢,下面的setInt方法可以成功!
stmt.setInt(2, start);
stmt.setInt(3, end);

rs = stmt.executeQuery();

while(rs.next()) {
Book book = new Book(rs.getInt("id"),
rs.getString("bookName"), rs.getString("bookType"), rs.getFloat("bookPic"));

bookList.add(book);
}
} catch (SQLException e) {
e.printStackTrace();
}finally{
close();
}
...全文
1123 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
loveofmylife 2011-06-16
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 ticmy 的回复:]

究其原因,就是%的含义变了,它变成了一个纯粹的字符,没有占位符的含义了
[/Quote]
误导我

scott@ORCL> select row_number() over(order by sal) S from emp where ename like '&1';
输入 1 的值: A%
原值 1: select row_number() over(order by sal) S from emp where ename like '&1'
新值 1: select row_number() over(order by sal) S from emp where ename like 'A%'

S
----------
1
2
fengyun817 2011-06-16
  • 打赏
  • 举报
回复
上面写错了,应该是 ROW_NUMBER() over ( partition by name order by id)
fengyun817 2011-06-16
  • 打赏
  • 举报
回复
第一语句写法不太对吧。
over里 只能有 group by 和 order by吧。

select* from (select *, ROW_NUMBER() over ( order by id ) rowid from BookInfo where bookName like ?) temp where rowid between ? and ?

第二,楼主用的数据库是什么?

驱动的jar包是odbc? odbc用prepareStatement模糊查询有问题,要换成jdbc的驱动。
龙四 2011-06-16
  • 打赏
  • 举报
回复
究其原因,就是%的含义变了,它变成了一个纯粹的字符,没有占位符的含义了
凯瑞甘 2011-06-16
  • 打赏
  • 举报
回复
stmt.setString(1, "'%测试书名%'");楼主试试
loveofmylife 2011-06-16
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 qq413041153 的回复:]

引用楼主 kkliuqi 的回复:
部分分页代码如下:
String sql = "select* from (select *, ROW_NUMBER() over (order by id where bookName) "+
"rowid from BookInfo where bookName like ?) temp where rowid between ? and ?";
……
[/Quote]

不要误导人家
谁告诉你子查询里不能使用绑定参数
首先楼主你这个sql能执行不?
ROW_NUMBER() over (order by id where bookName)开窗函数里的那个where bookName 表示看不懂
另外你前面的*必须有表明或者别名做前缀
什么叫没set进去啊,你也没说什么错误或者现象
KingViker 2011-06-16
  • 打赏
  • 举报
回复
[Quote=引用楼主 kkliuqi 的回复:]
部分分页代码如下:
String sql = "select* from (select *, ROW_NUMBER() over (order by id where bookName) "+
"rowid from BookInfo where bookName like ?) temp where rowid between ? and ?";
initConnection();
t……
[/Quote]

?占位符 不能存在于子查询里面, 所以你set不成功
xflr123 2011-06-16
  • 打赏
  • 举报
回复
这样写没出错吗 写的不对或者跟其他东西发生冲突 好好看看怎么回事
xinghen88 2011-06-16
  • 打赏
  • 举报
回复
[Quote=引用楼主 kkliuqi 的回复:]
stmt.setString(1, "%%");
[/Quote]
like后面跟的好像是'% %'吧,楼主定义个字符串变量,将like后面要跟的值赋给变量,然后再通过stmt.setString()赋值试试。
magong 2011-06-16
  • 打赏
  • 举报
回复
[Quote=引用楼主 kkliuqi 的回复:]
String sql = "select* from (select *, ROW_NUMBER() over (order by id where bookName) "+
"rowid from BookInfo where bookName like ?) temp where rowid between ? and ?";
[/Quote]
不要用子查询,这样做
String sql = "select *, ROW_NUMBER() over (order by id where bookName) rowid from BookInfo where bookName like ? and rowid between ? and ?";
loveofmylife 2011-06-16
  • 打赏
  • 举报
回复

scott@ORCL> declare
2 type c_ref_type is ref cursor;
3 ref_c c_ref_type;
4 rec emp%rowtype;
5 v_name varchar2(4);
6 begin
7 v_name := '&1';
8 open ref_c for q'!select empno,ename,job,mgr,hiredate,sal,comm,deptno
9 from (select emp.*, ROW_NUMBER() over(order by sal) row_id
10 from emp
11 where ename like :1) temp
12 where row_id between :1 and :1!'
13 using v_name, 1, 3;
14 loop
15 fetch ref_c
16 into rec;
17 exit when ref_c%notfound;
18 DBMS_OUTPUT.put_line('姓名: '||rec.ename || ' 薪水:' || rec.sal);
19 end loop;
20 close ref_c;
21 end;
22 /
输入 1 的值: A%
原值 7: v_name := '&1';
新值 7: v_name := 'A%';
姓名: ADAMS 薪水:1100
姓名: ALLEN 薪水:1600

PL/SQL 过程已成功完成。

使用A%做模糊查询,查出来姓名以A开头的结果升序排序后的前三条没问题吧(只有两个以A开头的)
loveofmylife 2011-06-16
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 kkliuqi 的回复:]

引用 6 楼 viszl 的回复:

引用 5 楼 qq413041153 的回复:

引用楼主 kkliuqi 的回复:
部分分页代码如下:
String sql = "select* from (select *, ROW_NUMBER() over (order by id where bookName) "+
"rowid from BookInfo where bookN……
[/Quote]
你贴的这个sql能运行??是oracle没错啊,这是oracle的分析函数啊
ROW_NUMBER() over (order by id where bookName)你的开窗函数order by id where bookName这能不报错??
还发现一个问题,你用伪劣rowid当你的行号别名,能不报错??
还有*前面没有标明前缀
我给你示范哈

scott@ORCL> select *,row_number() over(order by sal) from emp;
select *,row_number() over(order by sal) from emp
*
第 1 行出现错误:
ORA-00923: 未找到要求的 FROM 关键字


scott@ORCL> select t.*,row_number() over(order by sal) from emp t;

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
ROW_NUMBER()OVER(ORDERBYSAL)
----------------------------
7369 SMITH CLERK 7902 17-12月-80 800 20
1



另外你所说的绑定参数无效,就是你所说的没set进去
给你在SQLLPUS里演示一下,SQL结构和你的一样,只是表换成SCOTT模式下的EMP表

scott@ORCL> select ename ,sal from emp order by sal;

ENAME SAL
---------- ----------
SMITH 800
JAMES 950
ADAMS 1100
WARD 1250
MARTIN 1250
MILLER 1300
TURNER 1500
ALLEN 1600
CLARK 2450
BLAKE 2850
JONES 2975
SCOTT 3000
FORD 3000
KING 5000

已选择14行。

scott@ORCL> set serveroutput on
scott@ORCL> declare
2 type c_ref_type is ref cursor;
3 ref_c c_ref_type;
4 rec emp%rowtype;
5 v_name varchar2(4);
6 begin
7 v_name := '&1';
8 open ref_c for q'!select empno,ename,job,mgr,hiredate,sal,comm,deptno
9 from (select emp.*, ROW_NUMBER() over(order by sal) row_id
10 from emp
11 where ename like :1) temp
12 where row_id between :1 and :1!'
13 using v_name, 1, 3;
14 loop
15 fetch ref_c
16 into rec;
17 exit when ref_c%notfound;
18 DBMS_OUTPUT.put_line('姓名: '||rec.ename || ' 薪水:' || rec.sal);
19 end loop;
20 close ref_c;
21 end;
22 /
输入 1 的值: %%
原值 7: v_name := '&1';
新值 7: v_name := '%%';
姓名: SMITH 薪水:800
姓名: JAMES 薪水:950
姓名: ADAMS 薪水:1100

PL/SQL 过程已成功完成。


使用%%做模糊查询,出来的结果取升序排序后的前三条没问题吧
Mr_Fox_Q 2011-06-16
  • 打赏
  • 举报
回复
%的含义变了
kevinPai2011 2011-06-16
  • 打赏
  • 举报
回复
路过!
kkliuqi 2011-06-16
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 fengyun817 的回复:]

引用 14 楼 kkliuqi 的回复:

引用 9 楼 fengyun817 的回复:

第一语句写法不太对吧。
over里 只能有 group by 和 order by吧。
SQL code

select* from (select *, ROW_NUMBER() over ( order by id ) rowid from BookInfo where bookNa……
[/Quote]
连接获取到不就行了,还关系通过什么方式获取的?
kkliuqi 2011-06-16
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 viszl 的回复:]

引用 5 楼 qq413041153 的回复:

引用楼主 kkliuqi 的回复:
部分分页代码如下:
String sql = "select* from (select *, ROW_NUMBER() over (order by id where bookName) "+
"rowid from BookInfo where bookName like ?) temp wher……
[/Quote]
还有,我这个sql语句加整个web项目一个xx都没有,启动服务,访问也没有一个错误,就是这个查询没东西出来,我在这打印看到了所有的值都是有效并且满足需求的,我把这些值全部拼接上去就ok了,set就是不行,不是它出问题还是什么出问题?
fengyun817 2011-06-16
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 kkliuqi 的回复:]

引用 9 楼 fengyun817 的回复:

第一语句写法不太对吧。
over里 只能有 group by 和 order by吧。
SQL code

select* from (select *, ROW_NUMBER() over ( order by id ) rowid from BookInfo where bookName like ?) temp where ro……
[/Quote]

换了jdbc有没有改获取链接的地方?
Class.forName('jdbc.xx.Driver');
url = "jdbc:xxxxxxxxxxxx";
Connection conn = DriverManager.getConnection(url,user,password);
kkliuqi 2011-06-16
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 viszl 的回复:]

引用 5 楼 qq413041153 的回复:

引用楼主 kkliuqi 的回复:
部分分页代码如下:
String sql = "select* from (select *, ROW_NUMBER() over (order by id where bookName) "+
"rowid from BookInfo where bookName like ?) temp wher……
[/Quote]
当然能执行了,我不加“where bookName like ?”完全可以完成这条分页的sql查询,加上它只是为了加上一个模糊查询的功能
kkliuqi 2011-06-16
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 fengyun817 的回复:]

第一语句写法不太对吧。
over里 只能有 group by 和 order by吧。
SQL code

select* from (select *, ROW_NUMBER() over ( order by id ) rowid from BookInfo where bookName like ?) temp where rowid between ? and ?


第二,楼……
[/Quote]
刚开始用odbc我也猜是这个问题,可我换用的是jdbc4.jar,最新的jdbc包呀,还是set不进去呀
kkliuqi 2011-06-16
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 qq413041153 的回复:]

引用楼主 kkliuqi 的回复:
部分分页代码如下:
String sql = "select* from (select *, ROW_NUMBER() over (order by id where bookName) "+
"rowid from BookInfo where bookName like ?) temp where rowid between ? and ?";
……
[/Quote]
我也这样推断的,不过老师是这样在子查询中查询成功的啊
加载更多回复(2)

67,549

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧