oracle环境下项目遇到问题

由于实体和表名不同,在实体增加注解

img

通过spring-data-jdbc提供的仓库进行操作时,会将表名、字段名加双引号,例如:
SELECT "user123"."ID" AS "ID", "user123"."SEX" AS "SEX", "user123"."AGE" AS "AGE", "user123"."TENANT_ID" AS "TENANT_ID", "user123"."IS_DELETE" AS "IS_DELETE", "user123"."OWN_USER_ID" AS "OWN_USER_ID", "user123"."CREATED_BY" AS "CREATED_BY", "user123"."CREATED_DATE" AS "CREATED_DATE", "user123"."OWN_ORGAN_CODE" AS "OWN_ORGAN_CODE", "user123"."LAST_MODIFIED_BY" AS "LAST_MODIFIED_BY", "user123"."LAST_MODIFIED_DATE" AS "LAST_MODIFIED_DATE" FROM "user123"
但是有些业务比较复杂,所以采用querydsl进行查询,但是测试的时候发现,querydsl执行时没有对表名进行双引号处理,所以在此情况下,无论我初始化数据库采用大写表名、小写表名,都会有一种情况产生找不到的表的情况。
请问如何在不修改实体表明注解为大写的情况下,能解决如上问题

你把报错信息和报错代码段带我

【以下回答由 GPT 生成】

解决方案:

要解决Oracle环境中Querydsl查询时表名大小写不敏感的问题,可以通过自定义Querydsl的表名处理策略来实现。具体的解决步骤如下:

  1. 创建一个自定义的Querydsl表名处理策略类,该类需要实现TableNameResolver接口。可以命名为OracleCaseInsensitiveTableNameResolver

```java import com.querydsl.sql.*;

public class OracleCaseInsensitiveTableNameResolver extends DefaultTableNameResolver { @Override protected String normalizeName(String name) { return name.toLowerCase(); } } ```

在该类中,重写normalizeName方法,将表名转换为小写。

  1. 在Spring配置文件中,配置自定义的QuerydslConfiguration。

```java import com.querydsl.sql.*;

@Configuration public class QuerydslConfig {

   @Bean
   public OracleCaseInsensitiveTableNameResolver tableNameResolver() {
       return new OracleCaseInsensitiveTableNameResolver();
   }

   @Bean
   public SQLTemplates sqlTemplates() {
       return OracleTemplates.builder()
               .printSchema()
               .build();
   }

   @Bean
   public SQLQueryFactory sqlQueryFactory(DataSource dataSource, SQLTemplates sqlTemplates, OracleCaseInsensitiveTableNameResolver tableNameResolver) {
       Configuration configuration = new Configuration(sqlTemplates);
       configuration.setTableNameResolver(tableNameResolver);
       return new SQLQueryFactory(configuration, dataSource);
   }

} ```

在该配置类中,创建了一个OracleCaseInsensitiveTableNameResolver的Bean,并且配置了一个SQLTemplates的Bean。最后,创建了一个SQLQueryFactory的Bean,并将自定义的TableNameResolver设置到Configuration中。

  1. 在实体类中的注解声明中,指定表名的引号处理方式为DEFAULT(即使用默认的双引号处理)。

```java import javax.persistence.*;

@Table(name = "tableName", schema = "schemaName", catalog = "catalogName", quote = "\"") public class EntityName {

   // Entity properties and methods

} ```

@Table注解中,通过设置quote = "\"",即指定了默认的双引号处理方式。

通过以上步骤,就可以解决Oracle环境中Querydsl查询时表名大小写不敏感的问题,而无需修改实体类的注解。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^