2010-05-12 118 views
1

我想使用PostgreSQL作爲Hibernate/JPA的數據庫。但是,執行簡單查詢時出現錯誤。我的查詢如下:查詢Hibernate(JPA)和PostgreSQL的問題

SELECT DISTINCT p FROM UserProfile p ORDER BY :order 

當我執行查詢,我會傳遞一個值,如「lastLoginDate」爲:order。不過,我試圖執行查詢時出現以下情況例外:

ERROR org.hibernate.util.JDBCExceptionReporter - ERROR: for SELECT DISTINCT, ORDER BY expressions must appear in select list 
    Position: 781 

此查詢使用MySQL作爲數據庫工作得很好,但我們想對PostgreSQL的移動。我的整體配置和數據庫連接是正確的,因爲我看到正確創建表。有什麼我失蹤?有需要設置的配置屬性嗎?任何幫助你可以給予很大的讚賞。謝謝!

+0

你可以打開SQL註釋並將它們添加到帖子中嗎? – 2010-05-12 16:36:35

+0

http://archives.postgresql.org/pgsql-sql/2007-02/msg00169.php – Bozho 2010-05-12 17:31:49

+0

http://drupal.org/node/742896 – Bozho 2010-05-12 17:32:24

回答

7

PostgreSQL的禁止任何查詢,因爲它是ambiguous

there's actually a definitional reason for it. Consider 

     SELECT DISTINCT x FROM tab ORDER BY y; 

For any particular x-value in the table there might be many different y 
values. Which one will you use to sort that x-value in the output? 

這不是很清楚你想要什麼(?一個例子),但如果你打算將所有記錄進行排序「:爲了」列,然後刪除重複的值,你可以先用DISTINCT ON:,然後重新排序:

SELECT p FROM 
    (SELECT DISTINCT ON (p) * from UserProfile ORDER BY p , :order) 
    AS UserProfileUniq 
    ORDER BY :order ; 
+0

因此,我正在做的是這樣的: *創建一個命名查詢(對應於我發佈的查詢) *我設置參數,包括':order'參數,它指示我想排序哪一列 我的期望是我的查詢將被轉換爲例如: SELECT DISTINCT p FROM UserProfile p ORDER BY lastLoginDate; 這是MySQL的行爲。我將再次運行代碼,增加日誌記錄併發布我所得到的結果。我也會嘗試leonbloy的方法。 有人還建議刪除DISTINCT,如果我不需要它。你認爲這會起作用嗎? – Shadowman 2010-05-12 19:58:22

+0

爲了理解它是否會起作用,我們必須瞭解您期望的結果,並舉例說明(使用數據)。 – leonbloy 2010-05-12 20:01:48