升级到 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 方法,也会出现同样的错误
评论中建议的解决方案有帮助。
实现扩展
org.hibernate.dialect.PostgreSQLDialect
并覆盖 getLimitHandler
以返回 org.hibernate.dialect.pagination.LimitOffsetLimitHandler.INSTANCE
的自定义方言。
然后配置 Hibernate 以使用它。 在属性中指定
spring.jpa.database-platform=your.package.CustomPostgreSQLDialect
当我的开发数据库在 PostgreSQL 9.6.5 上运行时,我在 Spring Boot 3 迁移后的 FindTop、FindFirst、FindFirst10 中也遇到了这个问题。 我怀疑这是 JPA 和 PostgreSQL 的版本问题。 然后我检查了我的 QA 和其他环境,他们正在 PostgreSQL 11.6 上运行。 所以当时是没有问题的。
解决方案1: 将您的数据库升级到更高版本。这样就可以了。
解决方案2 使用本机查询
您可以使用社区一,而不是实现自己的方言。
<dependency>
<groupId>org.hibernate.orm</groupId>
<artifactId>hibernate-community-dialects</artifactId>
</dependency>
spring.jpa.database-platform: "org.hibernate.community.dialect.PostgreSQL81Dialect"
准确使用PostgreSQL81Dialect
非常重要
- 它强制使用旧版本的限制/偏移。