先说说我的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会更好一些。