teleport01 2009-04-16 09:42
浏览 481
已采纳

调用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会更好一些。

  • 写回答

11条回答 默认 最新

  • pmalex 2009-04-16 11:22
    关注

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(10条)

报告相同问题?

悬赏问题

  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作