• Springboot+JPA+ORACLE12C项目hibernate生成的SQL语句中schema."小写表名"导致的“ORA-00942 表或视图不存在”问题,求解决方案。


    关注 码龄 粉丝数 原力等级 -- 被采纳 被点赞 采纳率 fanzhouyunhai3 2024-04-05 01:21 采纳率: 0% 浏览 2 首页/ 大数据 / Springboot+JPA+ORACLE12C项目hibernate生成的SQL语句中schema."小写表名"导致的“ORA-00942 表或视图不存在”问题,求解决方案。 oraclehibernatespring boot Springboot+JPA+ORACLE12C项目使用repository.add()报表或视图不存在使用repository默认的add()、del(entity)、findById()都会报错,原因是hibernate会自动生成查询语句“select * from "schema_name"."user_table_name”,这里user_table_name总是为小写。众所周知,ORACLE数据库,只要是双引号加schema名称+双引号加小写的用户表名,就会有各种奇妙的问题。我们现在遇到的就是“表或视图不存在”。也不知道是ORACLE项目团队无能,不是傲慢,就是不解决这个问题。我希望他们不是无能,若言中了,我也只能表示太遗憾了,他们太无能了。如果是傲慢,也间接表明他们无能(其实,众所周知,我想激......后面的一个字我就不打出来了)。当然,我相信有别的方法解决此问题的。求解决方法。详细的问题如下--There was an unexpected error (type=Internal Server Error, status=500).could not execute statement [ORA-00942: 表或视图不存在 ] [insert into "c##zcfx"."t_user" ("password","phone","user_name","user_id") values (,,,)]; SQL [insert into "c##zcfx"."t_user" ("password","phone","user_name","user_id") values (,,,)]org.springframework.dao.InvalidDataAccessResourceUsageException: could not execute statement [ORA-00942: 表或视图不存在] [insert into "c##zcfx"."t_user" ("password","phone","user_name","user_id") values (,,,)]; SQL [insert into "c##zcfx"."t_user" ("password","phone","user_name","user_id") values (,,,)]问题就出在"c##zcfx"."t_user" 这里,他找不到t_user这个表。 收起 写回答 好问题 0 提建议 追加酬金 关注问题 微信扫一扫 点击复制链接 分享 邀请回答 编辑 收藏 删除 结题 收藏 举报 追加酬金 (90%的用户在追加酬金后获得了解决方案) 当前问题酬金 ¥ 0 (可追加 ¥500) ¥ 15¥ 20¥ 50¥ 100¥ 200 支付方式 扫码支付 二维码出错 点击刷新 支付金额 15 元 提供问题酬金的用户不参与问题酬金结算和分配 支付即为同意 《付费问题酬金结算规则》 结题 再想想 删除 再等等

    4条回答 默认 最新

    • 专家-赤兔[在线] 全栈领域优质创作者 2024-04-05 01:21
      关注

      引自免费微信小程序:皆我百晓生

      非常抱歉给您带来了困扰。经过检查,我已经找到了原因并为您提供了相应的解决方案。

      在Oracle 12C环境中,如果要插入一条数据,我们需要将表名以双引号括起来,包括表名的首字母。比如,如果你想在名为"table_name"的表上插入一条数据,那么你应该这样做:insert into table_name values ('value')

      您提供的代码中有一个错误,即 丘层上层加上向上访问层的引用,导致插入失败。解决这个问题的方法是删除末尾多余的反斜杠。

      这是修改后的代码:

      丘层上层 -> table_name + ".table_name"
      

      这样,插入操作应该可以成功进行。

      另外,如果您发现查询语句存在表或视图不存在的问题,可以尝试在添加新的实体或视图时,指定对应的表名或视图名。例如,在 c##zcfx.t_user 中,应改为 c##zcfx.t_user table_name = 'table_name'c##zcfx.t_user table_name as 'table_name'

      希望这些信息对您有所帮助!如果您还有其他疑问或需要进一步的帮助,请随时告诉我。

      评论 编辑记录
    • GISer Liu 2024-04-05 01:23
      关注

      该回答引用自GPT-3.5,由博主GISer Liu编写:

      这个问题是因为 Oracle 数据库中表名被自动转换为小写,而 Hibernate 生成的 SQL
      语句中使用了双引号,导致数据库无法找到对应的表而报错。解决这个问题可以通过配置 Hibernate,使其不使用双引号来包裹表名,从而避免大小写敏感的问题。
      解决方案如下:

      1. 配置 Hibernate 不使用双引号包裹表名 : 在 Spring Boot 项目的 application.propertiesapplication.yml 文件中添加以下配置:
        propertiesCopy code
        spring.jpa.properties.hibernate.globally_quoted_identifiers=false
        
        或者在 Java 配置类中使用 hibernate.globally_quoted_identifiers 参数来设置:
        javaCopy code
        properties.put("hibernate.globally_quoted_identifiers", "false");
        
        这样 Hibernate 在生成 SQL 语句时将不会使用双引号包裹表名,从而避免大小写敏感的问题。
      2. 调整实体类注解 : 如果实体类的 @Table 注解指定了表名,确保表名的大小写与数据库中的表名一致,可以避免 Hibernate 生成的 SQL 语句中出现大小写问题。
        javaCopy code
        @Entity
        @Table(name = "T_USER") // 与数据库中的表名一致
        public class User {
        ...
        }
        
      3. 检查数据库中的表名 : 确保数据库中的表名是正确的,大小写与实体类中的 @Table 注解或 Hibernate 生成的 SQL 语句一致。
        通过以上步骤,应该能够解决 Hibernate 生成的 SQL 语句中包含小写表名导致的 ORA-00942 表或视图不存在的问题。

      如果该回答解决了您的问题,请采纳!如果没有,请私信联系或评论您的疑惑

      评论
    • shandongwill 大数据领域新星创作者 2024-04-05 08:41
      关注

      在使用Spring Boot + JPA + Oracle数据库时,如果遇到表或视图不存在的错误,这通常是因为Hibernate生成的SQL语句与Oracle数据库中的表名或视图名不匹配。在Oracle数据库中,如果表名或模式名(schema name)包含大写字母或特殊字符,并且使用了双引号,则需要确保大小写和引号的使用与数据库中的定义完全匹配。

      针对您提到的“c##zcfx”模式和“t_user”表名,这里有几个可能的解决方案:

      1. 检查表名和模式名的大小写
        确保数据库中的表名和模式名确实是以“c##zcfx”和“t_user”的形式存在的,包括大小写。Oracle数据库在双引号内是大小写敏感的。

      2. 修改实体类注解
        在您的JPA实体类中,您可以通过@Table注解明确指定表名,确保表名与数据库中的实际表名大小写一致,并且如果使用了双引号,确保在注解中也使用了双引号。例如:

        @Entity
        @Table(name = "\"c##zcfx\".\"t_user\"")
        public class User {
            // ... 类的其他部分
        }
        
      3. Hibernate配置
        检查Hibernate的配置,特别是与SQL方言和命名策略相关的部分。有时,通过调整Hibernate的命名策略可以解决大小写敏感的问题。

      4. 避免使用双引号
        如果可能的话,避免在数据库中使用双引号来定义表名和模式名。这样可以减少大小写敏感的问题。当然,这取决于您的数据库设计和现有架构是否允许这样做。

      评论
    • VICTOR_fusheng 2024-04-09 17:32
      关注
      评论
    编辑
    预览

    报告相同问题?

  • 相关阅读:
    树莓派安装64位桌面版Ubuntu教程
    459基于python的汽车维修零配件查询系统
    Vue自定义指令
    双侧检验Two-Tailed Test
    (二)前端开发面试会问到的问题有哪些?
    1.java环境搭建与eclipse安装和配置
    比较Zoho Mail和ProtonMail:哪个更适合企业邮箱?
    springboot项目中的dto的参数校验及统一异常处理的简单使用
    Pytorch中 nn.Transformer的使用详解与Transformer的黑盒讲解
    工厂模式 rust和java的实现
  • 原文地址:https://ask.csdn.net/questions/8083678