休眠。将字符串参数设置为 char 25
Posted
技术标签:
【中文标题】休眠。将字符串参数设置为 char 25【英文标题】:Hibernate. Set string parameter as char 25 【发布时间】:2018-02-07 06:30:28 【问题描述】:我有一个 oracle 数据库。我对表 A 进行了查询,其中 b 列是 CHAR(25 BYTE)。当我通过休眠本机查询创建时
(select t.* from A t where t.b = :b).setParameter("b", "0123456789")
它返回了一个空结果。
当我创建像 (select t.* from A t where t.b = :b).setParameter("b", "0123456789 ")
这样的本机查询时,在“9”之后有 15 个空字符,它会按预期返回一个非空结果。
所以我的问题是——我该怎么做才能用hibernate写一个普通的查询?
谢谢。
【问题讨论】:
我看不出你创建的两个查询有什么不同,只是参数的长度不同。 @JohnJoe 由于输入参数的长度为 25,因此第二个查询可以正常工作。因此,如果我从我的应用程序 java 代码输入参数发送 10 个符号长度的查询,它不起作用。是否有可能在休眠中以某种方式指示对于此参数,休眠应该将其作为 char 25 或类似的东西发送 第二个查询中有两个 3。是这个错字还是你在数据库中有01233456789
的值?
@JohnJoe 对不起,我在写第二个例子时犯了一个错误。输入参数与第一个代码示例中的相同 - 0123456789,但在“9”之后的第二个示例中,它有 15 个空符号。 '0123456789' - 仅作为输入参数
您确定您的查询正确吗? "select t.* from A t.."
对我来说听起来很奇怪
【参考方案1】:
如果您确定要忽略尾随空格,最简单的解决方案(不是最快的)是在 HQL 中使用 rtrim 函数:
(select t.* from A t where rtrim(t.b) = :b).setParameter("b", "0123456789")
另一种解决方案是使用用户类型。看看这里:https://developer.jboss.org/wiki/UserTypeForDealingWithFixedLengthCHARFields
【讨论】:
我这样决定'select t.* from A t where t.b = rpad(:b, 25)'【参考方案2】:select t.* from A t where t.b = rpad(:b, 25)
rpad - 用于在 '9' 之后的右侧添加空白字符的 sql 函数。 25 - 这个参数'b'中必须有多少个字符。所以如果我使用 b 作为 '0123456789' 这个函数创建 b 参数为'0123456789 '
【讨论】:
以上是关于休眠。将字符串参数设置为 char 25的主要内容,如果未能解决你的问题,请参考以下文章