【问题标题】:Query problems with Hibernate (JPA) and PostgreSQLHibernate (JPA) 和 PostgreSQL 的查询问题
【发布时间】:2011-02-18 17:39:18
【问题描述】:

我正在尝试使用 PostgreSQL 作为 Hibernate/JPA 的数据库。但是,执行简单查询时出现错误。我的查询如下:

SELECT DISTINCT p FROM UserProfile p ORDER BY :order

当我执行查询时,我将为 :order 传递一个类似“lastLoginDate”的值。但是,尝试执行查询时出现以下异常:

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

使用 MySQL 作为数据库时,此查询运行良好,但我们希望转向 PostgreSQL。我的整体配置和数据库连接是正确的,因为我看到表正在正确创建。有什么我想念的吗?我需要设置配置属性吗?您可以提供的任何帮助将不胜感激。谢谢!

【问题讨论】:

标签: java hibernate postgresql jpa


【解决方案1】:

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?

不是很清楚你想要什么(一个例子?),但如果你打算按 ':order' 列对所有记录进行排序,然后删除重复值,你可以先用 DISTINCT ON: 做到这一点,然后重新排序:

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

【讨论】:

  • 所以我所做的是这样的: * 创建一个命名查询(对应于我发布的查询) * 我设置了参数,包括 ':order' 参数,它指示了我在哪一列想要排序我的期望是我的查询会被翻译成类似:SELECT DISTINCT p FROM UserProfile p ORDER BY lastLoginDate;这就是 MySQL 的行为。我将通过增加日志记录再次运行代码并发布我得到的内容。我也会尝试 leonbloy 的方法。如果我不需要,有人还建议删除 DISTINCT。你认为这会奏效吗?
  • 要了解它是否会起作用,我们必须通过一些示例(带有数据)来了解您期望的结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-20
  • 2021-02-19
  • 2018-03-17
  • 2012-07-20
  • 2016-02-27
  • 1970-01-01
相关资源
最近更新 更多