JPA 3 Hibernate + PostgreSQL 9.6.3 查询中出现限制错误

问题描述 投票:0回答:3

升级到 Spring Boot 3 后,我遇到了下一个问题; 我的实体

@Data
@Table(name = "campaign_status")
@Entity
public class CampaignStatus {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "campaign_status_id")
    private Long campaignStatusId;

    @Column(name = "name")
    private String name;

}

我的jpa存储库界面

@Repository
public interface CampaignStatusDao extends JpaRepository<CampaignStatus, Long> {
    CampaignStatus findTop1ByName(String status);
}

我在控制台中收到下一个错误

Hibernate: 
    select
        c1_0.campaign_status_id,
        c1_0.name 
    from
        campaign_status c1_0 
    where
        c1_0.name=? fetch first ? rows only

2023-01-26T11:43:12.854+02:00  WARN 18183 --- [           main] o.h.engine.jdbc.spi.SqlExceptionHelper   : SQL Error: 0, SQLState: 42601
2023-01-26T11:43:12.854+02:00 ERROR 18183 --- [           main] o.h.engine.jdbc.spi.SqlExceptionHelper   : ERROR: syntax error at or near "$2"
  Position: 99

我尝试使用 PostgreSQL 9.6.24,相同的代码没有错误。但是在生产环境中升级数据库版本会非常痛苦。所以也许有一种方法可以解决这个问题。 顺便说一下,如果我尝试使用分页执行 jpa 方法,也会出现同样的错误

postgresql hibernate jpa
3个回答
3
投票

评论中建议的解决方案有帮助。

实现扩展

org.hibernate.dialect.PostgreSQLDialect
并覆盖
getLimitHandler
以返回
org.hibernate.dialect.pagination.LimitOffsetLimitHandler.INSTANCE
的自定义方言。

然后配置 Hibernate 以使用它。 在属性中指定

spring.jpa.database-platform=your.package.CustomPostgreSQLDialect

0
投票

当我的开发数据库在 PostgreSQL 9.6.5 上运行时,我在 Spring Boot 3 迁移后的 FindTop、FindFirst、FindFirst10 中也遇到了这个问题。 我怀疑这是 JPA 和 PostgreSQL 的版本问题。 然后我检查了我的 QA 和其他环境,他们正在 PostgreSQL 11.6 上运行。 所以当时是没有问题的。

解决方案1: 将您的数据库升级到更高版本。这样就可以了。

解决方案2 使用本机查询


0
投票

您可以使用社区一,而不是实现自己的方言。

  1. 添加依赖:
<dependency>
    <groupId>org.hibernate.orm</groupId>
    <artifactId>hibernate-community-dialects</artifactId>
</dependency>
  1. 添加到application.yml:
spring.jpa.database-platform: "org.hibernate.community.dialect.PostgreSQL81Dialect"

准确使用PostgreSQL81Dialect非常重要

 - 它强制使用旧版本的限制/偏移。

© www.soinside.com 2019 - 2024. All rights reserved.