Jpa 查询报错语法错误 在 “-“ 或附近的


前言

在使用 JPA 进行数据库操作时,我们常常会遇到各种问题。本文将详细记录一次在根据roleId查询角色和权限关联表过程中遇到的报错及解决思路。

一、Jpa查询

实体类(PO)定义
在我们的项目中,定义了如下的实体类(PO,Persistent Object)来映射角色和权限关联表。

@Entity
@Table(name = "role_privilege", schema = "g-auth")
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class GAuthRoleMenuPO {
    @Id
    private String id;

    private String roleId;

    private String privilegeId;
}

数据访问对象(Dao)定义
为了实现对GAuthRoleMenuPO实体类的数据访问,我们定义了如下的数据访问对象(Dao,Data Access Object)。

@Repository
public interface GAuthRoleMenuDao extends JpaRepository<GAuthRoleMenuPO, String>, JpaSpecificationExecutor<GAuthRoleMenuPO> {
    List<GAuthRoleMenuPO> findAllByRoleId(String roleId);
}

二、调用报错

当我们在实际应用中调用上述查询方法时,遇到了如下错误:

Caused by: org.postgresql.util.PSQLException: 错误: 语法错误 在 "-" 或附近的
  位置:123
	at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2440)
	at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:2183)
	at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:308)
	at org.postgresql.jdbc.PgStatement.executeInternal(PgStatement.java:441)
	at org.postgresql.jdbc.PgStatement.execute(PgStatement.java:365)
	at org.postgresql.jdbc.PgPreparedStatement.executeWithFlags(PgPreparedStatement.java:143)
	at org.postgresql.jdbc.PgPreparedStatement.executeQuery(PgPreparedStatement.java:106)
	at com.alibaba.druid.pool.DruidPooledPreparedStatement.executeQuery(DruidPooledPreparedStatement.java:227)

三、报错信息分析

从报错信息可以看出,这是一个由 PostgreSQL 数据库抛出的语法错误。错误提示指出在某个位置(这里显示为 123)附近的-字符导致了语法问题。但是报错的类是postgresql的相关类。
在 SQL 中,模式名(schema)里包含 - 这样的特殊字符,会导致语法解析问题。大多数数据库在处理包含特殊字符的标识符时,需要进行转义。不同数据库的转义方式略有不同。

四、解决

使用双引号转义:在大多数支持 SQL 标准的数据库(如 PostgreSQL、MySQL 8.0 + 等)中,可以使用双引号来转义包含特殊字符的标识符(模式名、表名等)。在 JPA 的 @Table 注解中,可以这样修改:

@Entity
@Table(name = "role_privilege", schema = "\"g-auth\"")
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class GAuthRoleMenuPO {
    @Id
    private String id;
    private String roleId;
    private String privilegeId;
}

MySQL 特定处理(MySQL 8.0 之前):如果使用的是 MySQL 8.0 之前的版本,它对模式名中 - 的支持不太友好。一种解决办法是修改模式名,避免使用 - 这样的特殊字符。如果无法修改模式名,可以考虑使用存储过程或视图来间接访问数据,绕过模式名中特殊字符带来的直接访问问题。

其他数据库:不同数据库对于特殊字符的处理方式不同。例如,Oracle 中标识符默认不区分大小写(除非用双引号括起来),但同样对于包含特殊字符的标识符需要用双引号处理。在 SQL Server 中,可以使用方括号 [] 来转义标识符,不过在 JPA 的 @Table 注解中,仍然使用双引号来设置模式名,因为 JPA 会根据不同的数据库方言来正确生成 SQL 语句。

总结

记住了就行


在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr-Wanter

感谢大佬

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值