休眠。将字符串参数设置为 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的主要内容,如果未能解决你的问题,请参考以下文章

如何将值列表设置为休眠查询的参数?

ORACLE NLS_LENGTH_SEMANTICS 参数的用途

删除实体时休眠将外键设置为空

linux strtock()函数使用问题

4.06.数字或日期转换为字符串.TO_CHAR()

C: 格式“%s”需要“char*”类型的参数,但参数 2 的类型为“char**”