【问题标题】:@NativeQuery ORA-00942:表或视图不存在 - SpringBoot
【发布时间】:2022-01-23 13:14:34
【问题描述】:

所以我正在尝试进行本机查询以从 Oracle 数据库中获取一些数据,但我不断收到此错误:

java.sql.SQLSyntaxErrorException: ORA-00942: 表或视图没有 存在

我的查询是这个:

@Query(
        value = "select d.* from DEFAULT_GROUP d " +
            "inner join COMPANIA_DEFAULT_GROUP cd on d.ID = cd.DEFAULT_GROUP_ID " +
            "inner join COMPANIA c on c.ID = cd.COMPANIA_ID " +
            "where c.ID = cast(:companiaId AS NUMBER) and lower(d.NAME) like lower(cast(:dgName AS varchar(255))) ORDER BY d.NAME ASC " ,
        nativeQuery = true
    )
    List<DefaultGroup> findDefaultGroupsByNameLike(@Param("companiaId") Long companiaId,@Param("dgName") String dgName);

我的实体Compania是这样的:

@Entity(name = "Compania")
@Table(
    name = "compania"
)
public class Compania {
    @Id
    @SequenceGenerator(
        name = "compania_sequence",
        sequenceName = "compania_sequence",
        allocationSize = 1
    )
    @GeneratedValue(
        strategy = GenerationType.AUTO,
        generator = "compania_sequence"
    )
    @Column(
        nullable = false
    )
    private Long id;


    @Column(
        name = "name",
        nullable = false,
        unique = true
    )
    private String name;

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

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

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

    @OneToMany(
        cascade = CascadeType.ALL,
        fetch = FetchType.LAZY,
        orphanRemoval = true
    )
    private List<DefaultGroup> default_group;

    @OneToMany(
        cascade = CascadeType.ALL,
        fetch = FetchType.LAZY,
        orphanRemoval = true
    )
    private List<Office> office;

    public Compania() {
    }

    public Compania(String name, String dominio, String altas, String bajas, List<DefaultGroup> defaultGroup, List<Office> office) {
        this.name = name;
        this.dominio = dominio;
        this.altas = altas;
        this.bajas = bajas;
        this.default_group = defaultGroup;
        this.office = office;
    }
    ... Getters and Setters...

而我的实体Default Group是这样的:

@Entity
@Table
public class DefaultGroup {
    @Id
    @SequenceGenerator(
        name = "defaultGroup_sequence",
        sequenceName = "defaultGroup_sequence",
        allocationSize = 1
    )
    @GeneratedValue(
        strategy = GenerationType.SEQUENCE,
        generator = "defaultGroup_sequence"
    )
    @Column(
        nullable = false
    )
    private Long id;

    @Column(
        name = "name",
        nullable = false
    )
    private String name;

    @Column(
        name = "path",
        nullable = false
    )
    private String path;

    public DefaultGroup() {
    }

    public DefaultGroup(String name, String path) {
        this.name = name;
        this.path = path;
    }
   ... Getters and Setters...

当我检查 Azure Insights 中的故障时,我发现它正在尝试这个 SQL:

/* 动态原生 SQL 查询/ select d. from DEFAULT_GROUP d inner 在 d.ID = cd.DEFAULT_GROUP_ID 内加入 COMPANIA_DEFAULT_GROUP cd 在 c.ID = cd.COMPANIA_ID 上加入 COMPANIA c,其中 c.ID = cast(? AS NUMBER) 和 lower(d.NAME) like lower(cast(?AS varchar(?))) ORDER BY d.NAME ASC

然后抛出一个500 internal server error和oracle错误代码ORA-00942: table or view does not exist

我在错误堆栈的末尾也看到了这个错误:

Caused by: Error : 942, Position : 141, Sql = /* dynamic native SQL query */ select d.* from DEFAULT_GROUP d inner join COMPANIA_DEFAULT_GROUP cd on d.ID = cd.DEFAULT_GROUP_ID inner join COMPANIA c on c.ID = cd.COMPANIA_ID where c.ID = cast(:1  AS NUMBER) and lower(d.NAME) like lower(cast(:2  AS varchar(255))) ORDER BY d.NAME ASC , OriginalSql = /* dynamic native SQL query */ select d.* from DEFAULT_GROUP d inner join COMPANIA_DEFAULT_GROUP cd on d.ID = cd.DEFAULT_GROUP_ID inner join COMPANIA c on c.ID = cd.COMPANIA_ID where c.ID = cast(? AS NUMBER) and lower(d.NAME) like lower(cast(? AS varchar(255))) ORDER BY d.NAME ASC , Error Msg = ORA-00942: table or view does not exist

我的另一个名为 OFFICE 的表也发生了同样的事情

数据库拥有的表是:

  • 公司
  • COMPANIA_DEFAULT_GROUP(两个实体的 ID)
  • COMPANIA_OFFICE(两个实体的 ID)
  • DEFAULT_GROUP
  • 办公室

【问题讨论】:

    标签: java sql oracle hibernate nativequery


    【解决方案1】:

    我怀疑这里存在某种区分大小写的表命名问题。为了安全起见,请使用@Entity注解显式设置表name

    @Entity(name = "COMPANIA")
    public class Compania {
        ...
    }
    
    @Entity(name = "DEFAULT_GROUP")
    public class DefaultGroup {
        ...
    }
    
    @Entity(name = "COMPANIA_DEFAULT_GROUP")
    public class CompanyDefaultGroup {
        ...
    }
    

    【讨论】:

    • 我是否也应该更改列名和表名?
    • AFAIK @Table 在这里是多余的,因为 @Entity 中的 name 已经将传播到基础表。不确定列名,但这不是您当前错误消息的来源。
    • 好的,谢谢,我试试这个,我会及时通知你!谢谢!
    • 它仍然给我同样的错误,原因:错误:942,位置:141,我认为指向 COMPANIA,但我不知道那里有什么问题:S
    猜你喜欢
    • 2019-01-22
    • 2015-11-09
    • 2011-12-10
    • 2015-01-30
    • 2016-08-23
    • 2020-10-16
    • 2018-02-05
    • 1970-01-01
    相关资源
    最近更新 更多