2011-01-26 79 views
2

執行簡單Hibernate查詢且結果有限的以下兩種方法中的任何一種都不適用於Sybase。它們都導致SybSQLException:'@ p0'附近的語法不正確。Hibernate setMaxResults()不適用於Sybase數據庫查詢

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

回答

6

也許你配置Hibernate使用錯誤的SQL方言。

看起來像HSQLDialect是唯一可以產生limit ? ?的方言,它絕對是Sybase的錯誤選擇。

參見:

0

嘗試把setFirstResult(1)以及像:

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

你仍然得到同樣的錯誤?

+0

感謝您的回覆!是的,同樣的錯誤。我想其他人會發現這個問題,但我找不到其他人抱怨。 – 2011-01-26 18:02:10

+0

有趣的是,當我按照上面的要求完成操作時,Hibernate在SQL中看起來像這樣: select limit? ? record_id等 我知道哪些不適用於Sybase。根據我的理解,只支持「前50名」的語法。但是,我得到的錯誤仍然是一樣的,因爲我認爲它是在抱怨'?'它相當於@ p0,它是一些內部的Hibernate變量。 – 2011-01-26 18:11:35

0

setMaxResults()通常與setFirstResult()一起使用來實現分頁。例如。第一個查詢返回記錄1到1000,第二個查詢返回1001到2000,依此類推。嘗試一起使用。 (如果實現的話)例如,如果你有setMaxResults(1000)和setFetchSize(100),查詢將返回不超過1000行,並且將一次成批100行。

+0

我欣賞信息。我很熟悉如何使用這些方法。我感興趣的是解決這個容易重現的問題。稍後我會處理分頁和增量提取。我試圖將這些方法與setMaxResults一起使用,並且我繼續得到相同的問題。 – 2011-01-26 18:06:43

0

您可以使用它與頂級作品createSQLQuery選項。

相關問題