【问题标题】:SQLSyntaxErrorException: Table/View does not existSQLSyntaxErrorException:表/视图不存在
【发布时间】:2015-04-02 23:23:12
【问题描述】:

我得到一个大的堆栈跟踪,其根源是:java.sql.SQLSyntaxErrorException: Table/View 'U' does not exist. 后跟需要实体的所有内容的异常:java.sql.SQLTransactionRollbackException: Constraint 'PSSVSERSRDTABASEID' is invalid: referenced table U does not exist.

我查看了this question and answer 类似的问题,但它似乎并没有解决我的特定问题。原因是当我在 Eclipse 中打开Database Development 模式时,我可以看到所有其他实体都映射到一个表,但不是实体 User('U')。

用户实体:

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn(name = "disc", discriminatorType = DiscriminatorType.STRING)
@Table(name = "U")
@NamedQuery(name = "FIND_WITH_USER_ID", query="SELECT DISTINCT u FROM User u WHERE u.userId = :userId")
public class User implements Serializable{
    private static final long serialVersionUID = 2468889149889625824L;
    @Id @GeneratedValue
    protected long databaseId;

    //getters/setters/etc

}

用户确实有一个子类(显示在表架构中):

@Entity
public class Customer extends User{
    private static final long serialVersionUID = -5239293307816318553L;

    public Customer(){
        super();
    } 

    //getters/setters/etc

}

在我的 persistence.xml 文件中,如果表不存在,我会指定要创建的表:

<properties>
        <property name="javax.persistence.jdbc.driver" value="C:\Program Files\GlassFish\glassfish-4.1\glassfish4\javadb\lib\derby.jar"></property>
        <property name="javax.persistence.jdbc.url" value="jdbc:derby://localhost:1527/AppDB;create=true"></property>
        <property name="javax.persistence.schema-generation.database.action" value="drop-and-create"/>
</properties>

如前所述,其他表显示在数据库架构中(并且对数据库的 ping 成功)。问题似乎是围绕用户实体形成的。我认为这可能与保留关键字名称冲突有关,所以我更改了几次表的名称(一旦遇到此异常,Eclipse/Glassfish 似乎有问题,即使我进行了更改,例如作为名称,然后重新启动它不更新的应用程序;我相信超出了问题的范围)。

为什么没有为实体用户创建表?我错过了什么?为什么其他表还在创建中?

【问题讨论】:

  • 单词“user”是 ANSI 标准 SQL 中的保留字,因此要在 Derby 中使用它,您必须将其括在双引号中(也称为分隔标识符)。向 Derby 发出 SQL 时,您的对象/关系工具可能没有完全引用用户一词。您可以使用与“用户”不同的名称吗?
  • @Tiny 显然该表不存在!我的问题是:为什么没有为实体用户创建表?。实体名称为 User,对应的表名为 U。我已将其配置为在启动时创建表(persistence.xml 文件)。除了用户(表名“U”)之外,所有其他表都已创建(有问题)。
  • @BryanPendleton 是的,我知道“用户”这个词是保留字,因此是 @table(name = "U") annotation。这会更改表名,因此持久性提供程序会将实体映射到表 U。类名 User 应该与映射无关,因为我指定了 table 注释。我相信我的错误在于持久性提供程序的其他地方。我只是不确定在哪里。
  • 如果将&lt;property name="javax.persistence.schema-generation.database.action" value="drop-and-create" /&gt; 替换为&lt;property name="eclipselink.ddl-generation" value="drop-and-create-tables" /&gt; 会怎样?
  • 使用“-Dderby.language.logStatementText=true”运行 Derby,然后查看 derby.log 文件以查看向 Derby 发出的 SQL 语句以及返回的错误。

标签: java jakarta-ee jpa eclipselink derby


【解决方案1】:

问题在于您的 SQL 脚本,您传递的是表别名而不是列名。应该是你。

SELECT DISTINCT e.emp_id FROM Emp e

【讨论】:

  • 您能详细说明一下吗?您是在谈论我在实体上指定的 NamedQuery 吗?如果是这样,它就是一个有效的 JPQL 语句。
  • 我也遇到过同样的问题,原因是表名的别名。在您的情况下,您已将其定义为“:U”尝试此 SELECT DISTINCT u FROM User as u WHERE u.userId = :userId
  • 与查询语句无关。我在应用程序启动时收到错误消息。如果我想获取用户实例,@NamedQuery 供以后使用,并且它的方式是正确的。
  • 另外,在 JPQL 中,as 子句是可选的,因此,您的语句与我的 NamedQuery 语句完全相同(再次强调,这不是问题的原因)。
猜你喜欢
  • 2011-07-27
  • 1970-01-01
  • 2021-04-14
  • 2020-03-23
  • 1970-01-01
  • 2019-01-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多