如何诊断和修复休眠/ JPA显然没有2008年的SQL正确发送Unicode字符作为参数来查询(Ho

2019-10-19 19:26发布

我有一个数据库,在它的名字。 这些名字有时包含非ASCII字符,例如冈萨雷斯。 我已经得到了排序规则设置,例如,如果我搜索WHERE LastName LIKE '%Gonzalez%'我得到冈萨雷斯的纪录了。 在Management Studio中我可以搜索这两个WHERE LastName LIKE '%Gonzalez%'WHERE LastName LIKE '%González%'和两个返回正确的值。 然而,当我使用JPA / Hibernate的那个被发送到数据库显然并不代表查询á正确,因为我得到0的结果字符。

当利用show_sql属性,我可以看到实际的查询是好的,如果我复制和粘贴查询和更换? 用字符'%González%'我得到正确的结果。 同样,如果我搜索冈萨雷斯通过Web界面,我得到的结果,所以我相信它的á ,是造成我的问题,这是唯一的JPA /休眠导致该问题。 (说到这里的问题可能是AJAX提交的servlet,导致了问题,但是参数被作为?LastName=Gonz%C3%A1lez认为这是正确的?)

所以,如果它的JPA /休眠我该如何诊断/修复问题?

Answer 1:

show_sql日志配置属性只让你看到格式化的SQL语句,通过Hibernate生成。 为了进一步解决这个问题,你需要确保的值,休眠替换*“?” * s的,实际上是正确的。 看就怎么看处于休眠日志PARAM值线程和调整你的应用程序日志设置。

第二步我建议添加 - 在你的AJAX请求,编码所有PARAMS为Base64字符串,然后将其解码回UTF-8字符串中的控制器上,处理请求。

逻辑流应该如下:

  1. 客户端接收输入“冈萨雷斯”
  2. 客户端编码输入到“R29uesOhbGV6”并将其传递在AJAX请求
  3. 控制器,处理请求,参数解码为“冈萨雷斯”
  4. 控制器传递值下降到休眠逻辑,其中,休眠生成SQL并执行它
  5. 在应用程序日志,您会看到冬眠实际上通过“冈萨雷斯”参数下推到数据库


文章来源: How to diagnose and fix hibernate / jpa apparently not sending unicode characters correctly as a parameter to a query on SQL 2008