Sql Hibernate setMaxResults()不适用于Sybase数据库查询

Sql Hibernate setMaxResults()不适用于Sybase数据库查询,sql,hibernate,hql,sap-ase,Sql,Hibernate,Hql,Sap Ase,以下两种执行结果有限的简单Hibernate查询的方法在Sybase中都不起作用。它们都会导致一个SybSQLException:“@p0”附近的语法不正确。 Query q = session.createQuery( "from Record" ); q.setMaxResults( 50 ); q.list(); 或 在这两种情况下生成的实际SQL看起来像 select top ? record_id, etc... Sybase在?处犹豫不决,Hibernate没有填充值50(这是我

以下两种执行结果有限的简单Hibernate查询的方法在Sybase中都不起作用。它们都会导致一个SybSQLException:“@p0”附近的语法不正确。

Query q = session.createQuery( "from Record" );
q.setMaxResults( 50 );
q.list();

在这两种情况下生成的实际SQL看起来像

select top ? record_id, etc...
Sybase在?处犹豫不决,Hibernate没有填充值50(这是我的猜测)。我到处都搜索过,虽然其他人也遇到了类似的错误,但这并不是因为试图限制结果

我可以执行直接SQL语句,比如“从记录中选择前50名”,它工作得非常好,所以我知道我的Sybase版本支持这种语法


我正在使用Hibernate 3.2和Sybase ASE 15.0.2

尝试放置
setFirstResult(1)
,以及:

Criteria criteria = session.createCriteria(Record.class);
criteria.setFirstResult(1);
criteria.setMaxResults(50);
criteria.list();
您仍然会收到相同的错误吗?

setMaxResults()
通常与
setFirstResult()
一起使用以实现分页。第一个查询返回记录1到1000,第二个查询返回1001到2000,依此类推。试着一起使用


setFetchSize()
控制JDBC驱动程序一次提取多少行。(如果实现)因此,例如,如果您有setMaxResults(1000)和setFetchSize(100),查询将返回不超过1000行,并且一次将以100行为一批返回

也许您将Hibernate配置为使用错误的SQL方言

看起来,
hsqldialine
是唯一能产生
limit,对于Sybase来说,这绝对是一个错误的选择

另请参见:


您可以使用createSQLQuery选项,该选项适用于TOP。

感谢您的回复!是的,同样的错误。我想其他人已经发现了这个问题,但我找不到其他人在抱怨。有趣的是,当我完全按照上面的要求做时,Hibernate在SQL中将其转化为:select limit?我知道在Sybase中不起作用的记录id等。据我所知,仅支持“TOP50”语法。但是,我得到的错误仍然是一样的,因为我认为它在抱怨“?”,它将“?”解释为@p0,我相信这是某种内部Hibernate变量。我很感激这些信息。我熟悉如何使用这些方法。我感兴趣的是解决这个容易重复的问题。稍后我将处理分页和增量抓取。我尝试将这些方法与setMaxResults一起使用,但我仍然遇到同样的问题。正如您已经知道的那样,“?”来自准备好的语句。在执行sql之前,应该将数字50放在那里。也许您正在使用的jdbc驱动程序有一些问题/bug?这不是jdbc驱动程序的问题,因为我可以使用同一个驱动程序执行简单的sql“select top 50*from build_records”,它工作正常。问题似乎是Hibernate在生成SQL时没有将数字50放入SQL。真想不到,除了我,这一切都会被认出来。真尴尬。你完全正确。我们用的是HSQL方言。其他人设置了hibernate.cfg.xml文件,所以我总是认为它是正确的。多年来,我们一直在努力解决项目中的限制问题。非常感谢你。现在我们使用Sybase方言,它工作得很好。
Criteria criteria = session.createCriteria(Record.class);
criteria.setFirstResult(1);
criteria.setMaxResults(50);
criteria.list();