调用hibernate的query接口为hql语句参数传值,没起作用?

先说说我的hql语句:
[code="java"]FROM Ciuser U WHERE 1=1 AND U.id.userId=?[/code]
hibernate对应的表是无主键,我传参的方式也是用‘?’代替的,而不是‘:参数名’。
通过hibernate的Query接口执行hql语句。
[code="java"]
Query query = session.createQuery(hql);
query.setParameter(0,值);
return query.list();
[/code]
代码运行大致是这样,但是执行完后是没查询到任何结果的。
后来我换成‘:参数名’的方式进行传参,但还是没有效果。
但是我换种方式,直接拼成字符串
[code="java"]
FROM Ciuser U WHERE 1=1 AND U.id.userId='" + string对象 + "'

Query query = session.createQuery(hql);
return query.list();
[/code]
以上拼字符串方式又是没问题的,不知道是什么原因,请各位指教!

我所使用的hibernate是3.3.1.GA spring是2.5.5。不知道和包有关系没有?
以前我使用JDBC也遇到过此种问题,当时没有重视。PreparedStatement的setParameter,也是没起作用,为什么呢?
[b]问题补充:[/b]
我找到原因了,跟数据库字段类型有关系。
USER_ID这个字段,在数据库中是char(20),使用setParameter的话,就必须补空格20位定长才能查询出来,如果字段类型是varchar()就没问题。
但是char()的效率在varchar()之上,也不能因为程序的原因去修改数据库,何况USER_ID这个字段是会经常修改的。
如果这种问题,各位平时是怎么处理的。
[b]问题补充:[/b]
我用的是oracle数据库。
我用char的原因是USER_ID这个字段值不是定长的,但是会经常修改,如果换成varchar的话后期查询效率肯定会大大降低的。

如何是这种情况大家怎么处理。
[b]问题补充:[/b]
VARCHAR2虽然比CHAR节省空间,但是如果一个VARCHAR2列经常被修改,而且每次被修改的数据的长度不同,这会引起'行迁移' (Row Migration)现象,而这造成多余的I/O,是数据库设计和调整中要尽力避免的,在这种情况下用CHAR代替VARCHAR2会更好一些。

[code="java"]VARCHAR2虽然比CHAR节省空间,但是如果一个VARCHAR2列经常被修改,而且每次被修改的数据的长度不同,这会引起'行迁移' (Row Migration)现象,而这造成多余的I/O,是数据库设计和调整中要尽力避免的,在这种情况下用CHAR代替VARCHAR2会更好一些。 [/code]
虽然着是事实但是略有点危言耸听了,我们公司还在开发移动的应用呢,照样使用nvarchar完全没有一点问题!

这样太搞了吧,用hibernate也许是主键问题,但jdbc应该不会有问题的

试一下
[code="java"] FROM Ciuser U WHERE 1=1 AND U.id.userId=:name [/code]
如果不行,就是设置问题!
拼的没问题说明没有丢jar包!

你把1=1这个条件去了试试,如果你的查询条件是动态添加的那你就使用Criteria做查询。

char在varchar之上是不争的事实!

但是开发遵循的第一条原则是:快速方便开发!
如果访问量不是非常大,完全没有必要使用varchar,必要的冗余与速度损耗,是无伤大雅的!

至于请问你用的是何种数据库?

哦哦,看来数据库本身的限制,这就有点难为程序了,

你就用程序把这个字段的值转成20位就好啊

string.length()+(20-string.length())个空格嘛

那你就做like查询。说句实话我真没有觉出char()和varchar()在效率上有多大差别,一般都是用varchar或varchar2,除非明确说明字段长度就是几(个位数,一般不大于3),而且存的实际值长度一致,否则不考虑char.

这个我帮你问过我们公司的DBA了,实际开发中varchar改成char是优化的一部分!
如果实际开发访问压力不是非常大(指数据库访问压力)给了两个建议:
1、实际开发中你不可能不改动字符长度,使用char不可取
2、可以忽略不计,倒是开发的时候要尽量少向数据库拿去数据。

所给给你两个选择:
1 访问量不大 那就用varchar
2 如果大,你就用上面的方法
[code="java"]string.length()+(20-string.length())[/code]

还有你的hql访问问题,估计也能迎刃而解了吧!

刚刚没说清楚
varchar改成char是优化的一部分
但是实际开发中,不是非常大的压力,没有性能差距!

我们公司还大量使用nvarchar,记住开发第一原则:简单方便快速,其次是性能等!

[code="java"]

public String writeFixedString(String s, int size)

{
StringBuilder sb = new StringBuilder();
for (int i = 0; i < size; i++)
{

char ch = 0;
if (i < s.length()) ch = s.charAt(i);
sb.append(ch);
}
}

[/code]

s = writeFixedString(s,20);
用这个去查询就好了嘛

尝试一下指定第三个参数,指定参数类型,参见hibernate api文档。
[url]http://www.hibernate.org/hib_docs/v3/api/org/hibernate/Query.html[/url]