2010-05-12 162 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