【问题标题】:JPA NamedNativeQuery syntax error with Hibernate, PostgreSQL 9Hibernate、PostgreSQL 9 的 JPA NamedNativeQuery 语法错误
【发布时间】:2015-09-01 13:23:16
【问题描述】:

我遇到了一个很奇怪的问题。我有在 sql server 上执行时完美运行的本机查询:

SELECT  date_time, GREATEST(sum(count_up - count_down) OVER (PARTITION BY date_trunc('day', result.date_time) ORDER BY date_time),0) AS cum_amt FROM   peoplecounting.result order  BY date_time;

但是,在 JPA 中将此查询用作本机查询会导致语法错误

@NamedNativeQueries({@NamedNativeQuery(
        name = "Result.getTotal",
        query = "SELECT  date_time, GREATEST(sum(count_up - count_down) OVER (PARTITION BY date_trunc('day', peoplecounting.result.date_time) ORDER BY date_time),0) AS cum_amt FROM   peoplecounting.result order  BY date_time;")})

public class Result implements Serializable {...

///

@Entity
@SqlResultSetMapping(name = "TotalResultMapping", entities = {@EntityResult(entityClass = TotalResult.class, fields = {@FieldResult(name = "total", column = "cum_amt"), @FieldResult(name = "date", column = "date_time")})})

public class TotalResult {

private static final long serialVersionUID = 1L;

public TotalResult() {
}


@Id Date date;

public Date getDate() {
    return date;
}

public void setDate(Date date) {
    this.date = date;
}

public Integer getTotal() {
    return total;
}

public void setTotal(Integer total) {
    this.total = total;
}

Integer total;

}

打电话时:em.createNativeQuery("Result.getTotal","TotalResultMapping").getResultList();

我明白了:

INFO  [stdout] (default task-44) Hibernate: Result.getTotal
WARN  [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (default task-44) SQL Error: 0, SQLState: 42601
ERROR [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (default task-44) Error: Syntax error at or near "Result"

【问题讨论】:

    标签: java hibernate postgresql jpa


    【解决方案1】:

    所以问题是em.createNativeQuery(...) 不是正确调用NamedNativeQuery,为了做到这一点,我应该调用em.createNamedQuery(...)。但是,看到em.createNativeQuery(...) 不接受@SqlResultSetMapping,很难将结果映射到自定义类。

    最终的解决方案是使用

     return em.createNativeQuery("SELECT  peoplecounting.result.date_time, GREATEST(sum(peoplecounting.result.count_up - peoplecounting.result.count_down) " +
                "OVER (PARTITION BY date_trunc('day', peoplecounting.result.date_time) " +
                "ORDER BY peoplecounting.result.date_time),0) AS cum_amt" +
                " FROM   peoplecounting.result" +
                " order  BY peoplecounting.result.date_time",
                "TotalResultMapping").getResultList();
    

    这样我可以使用我的@SqlResultSetMapping,一切都很好。

    【讨论】:

      【解决方案2】:

      SQLState 是 42601,这是语法错误,根据PosgreSQL's list of error codes

      尝试删除命名本机查询声明末尾的分号。尽管您在对数据库本身发出查询时使用了分号,但分号并不是查询本身的一部分。

      因此,这可能有效(未经测试,但当您尝试向普通 JDBC 查询添加分号时,Oracle 遇到了类似的问题):

      @NamedNativeQueries({@NamedNativeQuery(
          name = "Result.getTotal",
          query = "SELECT  date_time, GREATEST(sum(count_up - count_down) OVER (PARTITION BY date_trunc('day', peoplecounting.result.date_time) ORDER BY date_time),0) AS cum_amt FROM   peoplecounting.result order  BY date_time")})
      

      【讨论】:

      • 删除分号并没有改变任何东西
      猜你喜欢
      • 2015-11-20
      • 1970-01-01
      • 2015-05-19
      • 1970-01-01
      • 1970-01-01
      • 2023-02-05
      • 1970-01-01
      • 1970-01-01
      • 2016-06-26
      相关资源
      最近更新 更多