hibernate Spring Boot jdbcTemplate.Query抛出的表未找到自动将表名转换为大写

eimct9ow  于 2022-11-14  发布在  Spring
关注(0)|答案(1)|浏览(184)

我有一个带有多个左连接的查询位复杂的jdbcTemplate.Query方法,因此我很难实现基于接口的存储库方法。
我使用的是来自AWS RDS的MySQL数据库。
当查询执行SpringBoot时,JPA自动将表名转换为大写,并抛出错误:TABLE NOT FOUND。
例外情况是:
WITH PATH[]引发异常[请求处理失败;嵌套异常是org.springframework.jdbc.BadSqlGrammarException:语句回调;错误的SQL语法[SELECT DISTINCT TEST_Desc FROM test_name_table];嵌套异常is org.h2.jdbc.JdbcSQLSynaxErrorException:找不到表“TEST_NAME_TABLE”;SQL语句:SELECT DISTINCT TEST_Desc from test_name_table[42102-200]]具有根本原因组织.h2.jdbc.JdbcSQLSynaxError异常:未找到表“TEST_NAME_TABLE”;SQL语句:SELECT DISTINCT TEST_Desc from test_name_table[42102-200]
以下是我尝试过的解决方案:
来自应用程序.属性:
Spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl spring.jpa.database-platform=org.hibernate.dialect.MySQL8Dialect spring.jpa.hibernate.Naming_Strategy=org.hibernate.cfg.DefaultNamingStrategy
数据库URL:
Spring.datasource.dataSourceProperties.serverName=test-instance.us-east-1.rds.amazonaws.com;DATABASE_TO_UPPER=FALSE;CASE_INSENSITIVE_IDENTIFIERS=TRUE;
正如您在上面的SQL查询中所看到的,我甚至将表名放在反号内。但运气不佳。
我尝试将MySQL中的表名重命名为TEST_NAME_TABLE,但仍然无济于事。
对此有什么推荐的修复方法吗?

hmmo2u0o

hmmo2u0o1#

对模型使用@Table(name = "table_name"),对模型中的每一列使用@Column(name = "column_name")注解是一种很好的做法。
并对ModelRepository.java中使用的每个查询使用@Query("some query in SQL")
示例:

@Entity
@Table
public class Employee implements Serializable {
    @Id

    @Column(name = "emp_id")
    private Long id;

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

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

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

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

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

    @Column(name = "employeeCode")
    private String employeeCode;
}
@Repository
public interface EmployeeRepository extends JpaRepository<Employee, Long> {

    @Query("SELECT s FROM Employee s WHERE s.email = ?1")
    Optional<Employee> findEmployeeByEmail(String email);
}

相关问题