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

发布于 2024-10-14 03:14:19 字数 651 浏览 6 评论 0原文

以下两种执行结果有限的简单 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

Hello爱情风 2024-10-21 03:14:19

也许您将 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 produce limit ? ?, and it's definitely a wrong choice for Sybase.

See also:

笑叹一世浮沉 2024-10-21 03:14:19

尝试输入 setFirstResult(1) 以及:

Criteria criteria = session.createCriteria(Record.class);
criteria.setFirstResult(1);
criteria.setMaxResults(50);
criteria.list();

您仍然遇到相同的错误吗?

Try putting setFirstResult(1) as well like:

Criteria criteria = session.createCriteria(Record.class);
criteria.setFirstResult(1);
criteria.setMaxResults(50);
criteria.list();

Do you still get the same error?

梦里梦着梦中梦 2024-10-21 03:14:19

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

setFetchSize() 控制 JDBC 驱动程序一次获取多少行。(如果实现)因此,如果您有 setMaxResults(1000) 和 setFetchSize(100),则查询将不再返回超过 1000 行,并且一次会分批处理 100 行。

setMaxResults() is typically used together with setFirstResult() 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.

十二 2024-10-21 03:14:19

您可以使用与 TOP 一起使用的 createSQLQuery 选项。

You can use createSQLQuery option which works with TOP.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文