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

时间:2011-01-26 17:41:46

标签: sql hibernate hql sybase-ase

执行具有有限结果的简单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

4 个答案:

答案 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选项。