【问题标题】:Hibernate setMaxResult causes exception休眠 setMaxResult 导致异常
【发布时间】:2014-04-02 08:51:02
【问题描述】:

每当我使用 setMaxResult 时,我都在使用带有休眠会话的条件(不是实体管理器),我得到如下异常:

代码段:

crit2.add(criterion).setFirstResult(first);

它和上面一样完美,但是每当我添加 setmax 结果为:

crit2.add(criterion).setFirstResult(first).setMaxResults(max);

我得到异常。我尝试了 2 种方言并得到 2 个不同的例外:

方言: org.hibernate.dialect.SQLServer2008Dialect
何时:它从不给出结果,但总是在下面给出异常
异常: strong> 原因:com.microsoft.sqlserver.jdbc.SQLServerException: '.' 附近的语法不正确。

方言: org.hibernate.dialect.SQLServerDialect
时间:它按预期返回第一页,但每当我尝试获取第二页或更多页时,我都会得到异常: 原因:com.microsoft.sqlserver.jdbc.SQLServerException:仅转发结果集不支持请求的操作。

顺便说一句,我使用的是 Microsoft SQL Server 2008 R2

编辑:

我意识到这是关于土耳其英语字符集差异的问题。 Hibernate 使用每个字段的小写字母,但在 I 中它生成 i 但对于 Sqlserver,I 的小写字母是 ı(如土耳其语)

例如: sonIslemTarihi 是属性名称,休眠将查询创建为 sonislemtarihi 并给出错误,我将查询更改为 sonıslemtarihi 并从 sql server management studio 执行,结果按预期进行。

我该如何处理?

【问题讨论】:

  • 您可以更改记录器级别并检查生成的查询吗?
  • @NayanWadekar 我添加了堆栈跟踪以供您参考,但我不能为您提供 sql 查询以不显示项目的域模型(我的公司不允许我这样做)但肯定查询已损坏,尤其是对于 SQLServer2008Dialect。但我无法更改查询,因为我想使用条件。
  • 无需实际查询,您可以屏蔽机密数据并更新类似的数据。您也可以发布第一个和最大值。
  • 第一页第一个值为0,第二页为10,最大值为10。我现在有点忙,我稍后会发布屏蔽的sql查询。 (顺便说一句,感谢您对@NayanWadekar 的关注)
  • 我意识到问题在于土耳其-英语字符集的差异。 Hibernate 使用每个字段的小写字母,但在 I 中它生成 i 但对于 Sqlserver,I 的小写字母是 ı(如土耳其语)例如: sonIslemTarihi 是属性名称和休眠创建查询为 sonislemtarihi 并给出错误,我将查询更改为 sonıslemtarihi 并从 sql server management studio 执行,它按预期工作。我该如何处理?

标签: java sql-server hibernate jpa


【解决方案1】:

[添加答案,因为它变得太长,不适合发表评论]

我对 MS-SQL 不太熟悉,但org.hibernate.dialect.SQLServer2008Dialect 似乎是正确的方言。

    <property name="hibernate.connection.CharSet">utf8</property>
    <property name="hibernate.connection.characterEncoding">utf8</property>
    <property name="hibernate.connection.useUnicode">true</property>
    <property name="hibernate.connection.defaultNChar">true</property>

数据库字符编码与hibernate生成的编码之间存在一些不匹配。尝试更改这些配置参数并观察生成的查询。

【讨论】:

  • 没用,结果还是一样。问题是每当我添加 setMaxResult(max) hibernate 将查询的所有字符都更改为小写但除非它,hibernate 使用正常格式。有什么办法可以防止 Hibernate 把所有字符都改成小写?
  • @bdogru 如果您的数据库在土耳其语环境中,那么也需要在 Fibernate 配置中进行相同的配置,可能是 - [tr_TR]。也可以参考这个链接 - hibernate.atlassian.net/i#browse/HHH-8765 我认为它已修复,看看你的休眠版本。
猜你喜欢
  • 2014-10-25
  • 1970-01-01
  • 2011-02-14
  • 2014-08-22
  • 2011-09-20
  • 2017-07-06
  • 2012-02-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多