执行具有有限结果的简单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语句,例如'从Record中选择前50个',它运行正常,所以我知道我的Sybase版本支持语法。
我正在使用Hibernate 3.2和Sybase ASE 15.0.2
答案 0 :(得分:6)
也许您将Hibernate配置为使用错误的SQL方言。
看起来HSQLDialect
是唯一可以生成limit ? ?
的方言,对于Sybase来说这绝对是错误的选择。
另见:
答案 1 :(得分:0)
尝试将setFirstResult(1)
添加为:
Criteria criteria = session.createCriteria(Record.class);
criteria.setFirstResult(1);
criteria.setMaxResults(50);
criteria.list();
你还得到同样的错误吗?
答案 2 :(得分:0)
setMaxResults()
通常与setFirstResult()
一起使用来实现分页。例如。第一个查询返回记录1到1000,第二个查询返回1001到2000,依此类推。尝试一起使用。
setFetchSize()
控制JDBC驱动程序一次获取多少行。(如果已实现)因此,如果您具有setMaxResults(1000)和setFetchSize(100),则查询将返回不超过1000行,并且将一次批量生成100行。
答案 3 :(得分:0)
您可以使用与TOP配合使用的createSQLQuery选项。