Hibernate setMaxResults() 不适用于 Sybase 数据库查询
以下两种执行结果有限的简单 Hibernate 查询的方法在 Sybase 中都不起作用。它们都会导致SybSQLException:'@p0'附近的语法不正确。
Query q = session.createQuery( "from Record" );
q.setMaxResults( 50 );
q.list();
或者
Criteria criteria = session.createCriteria( Record.class );
criteria.setMaxResults( 50 );
criteria.list();
这两种情况下生成的实际SQL看起来像...
select top ? record_id, etc...
并且Sybase对“?”犹豫不决,而Hibernate是不填写值 50(这是我的猜测)。我到处搜索,虽然其他人也遇到过类似的错误,但这并不是因为试图限制结果。
我可以执行直接的 SQL 语句,例如“从记录中选择前 50 条”,它运行得很好,所以我知道我的 Sybase 版本支持该语法。
我正在使用 Hibernate 3.2 和 Sybase ASE 15.0.2
Either of the following two approaches to executing a simple Hibernate query with limited results do not work in Sybase. They both result in a SybSQLException: Incorrect syntax near '@p0'.
Query q = session.createQuery( "from Record" );
q.setMaxResults( 50 );
q.list();
or
Criteria criteria = session.createCriteria( Record.class );
criteria.setMaxResults( 50 );
criteria.list();
It appears the actual SQL generated in both of these cases looks like...
select top ? record_id, etc...
and Sybase is balking at the ?, which Hibernate is not filling in with the value 50 (this is my guess). I've searched everywhere and while others have encountered a similar error, it was not due to attempting to limit the results.
I can execute a direct SQL statement such as 'select top 50 from Record' and it works perfectly, so I know my version of Sybase supports the syntax.
I'm using Hibernate 3.2 and Sybase ASE 15.0.2
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
也许您将 Hibernate 配置为使用错误的 SQL 方言。
看起来
HSQLDialect
是唯一可以产生limit 的方言? ?
,这对于Sybase来说绝对是一个错误的选择。另请参阅:
Perhaps you configured Hibernate to use a wrong SQL dialect.
It looks like
HSQLDialect
is the only dialect that can producelimit ? ?
, and it's definitely a wrong choice for Sybase.See also:
尝试输入
setFirstResult(1)
以及:您仍然遇到相同的错误吗?
Try putting
setFirstResult(1)
as well like:Do you still get the same error?
setMaxResults()
通常与setFirstResult()
一起使用来实现分页。例如。第一个查询返回记录 1 到 1000,第二个查询返回记录 1001 到 2000,依此类推。尝试一起使用。setFetchSize()
控制 JDBC 驱动程序一次获取多少行。(如果实现)因此,如果您有 setMaxResults(1000) 和 setFetchSize(100),则查询将不再返回超过 1000 行,并且一次会分批处理 100 行。setMaxResults()
is typically used together withsetFirstResult()
to implement paging. Eg. the first query returns records 1 to 1000, the second query returns 1001 to 2000, and so on. Try using together.setFetchSize()
control how many rows are fetched at a time by the JDBC driver.(if implemented) So, if you for example have setMaxResults(1000) and setFetchSize(100) the query will return no more than 1000 rows, and will do so in batches of 100 rows at a time.您可以使用与 TOP 一起使用的 createSQLQuery 选项。
You can use createSQLQuery option which works with TOP.