java.sql.SQLException:找不到列“JOB_ID”

Posted

技术标签:

【中文标题】java.sql.SQLException:找不到列“JOB_ID”【英文标题】:java.sql.SQLException: Column 'JOB_ID' not found 【发布时间】:2016-08-31 13:41:37 【问题描述】:

我将 Java8 与 JPA2/Hibernate5、Spring4 和 mysql 一起使用。

如果有人可以提供帮助,我将不胜感激。

我有以下表格。

+--------+          +------------+        +---------+
| job    |          | person_job |        | person  |
+--------+          +------------+        +---------+
|  ID    |          |  JOB_ID    |        |   ID    |
|        |          |  PER_ID    |        |         |
+--------+          +------------+        +---------+

一个person 可以有多个jobs

Job.java

@ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinTable(name = "person_job", joinColumns = 
        @JoinColumn(name = "PER_ID", referencedColumnName = "ID") , inverseJoinColumns = 
                @JoinColumn(name = "JOB_ID", referencedColumnName = "ID", unique = true) )
private Person person;

当我直接针对数据库运行以下 SQL 时,它可以正常工作:

select
         e.*, p.*
     from
         www.job as e  
     inner join
         www.person_job as pj 
             on e.id=pj.JOB_ID  
     inner join
         www.person as p 
             on pj.PER_ID=p.ID  
...

当我运行本机查询(使用上述 sql)时,我收到以下错误:

Job.java中,如果我在@JoinTable 中交换JOB_IDPER_ID,那么我得到:

java.sql.SQLException:找不到列“PER_ID”。

由于上面的 SQL 在数据库上运行良好,我认为问题在于 Job.java 中的连接配置。


更新

我也有以下正常工作:

+--------+          +--------------+        +----------+
| job    |          | job_location |        | location |
+--------+          +--------------+        +----------+
|  ID    |          |  JOB_ID      |        |   ID     |
|        |          |  LOC_ID      |        |          |
+--------+          +--------------+        +----------+

一个job 可以有多个locations

jobs.java

@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinTable(name = "job_location", joinColumns = 
        @JoinColumn(name = "JOB_ID", referencedColumnName = "ID") , inverseJoinColumns = 
                @JoinColumn(name = "LOC_ID", referencedColumnName = "ID", unique = true) )
private Set<Location> locations;

更新

我只在执行本机查询时收到此错误。当我执行以下 fr 示例时,它可以完美运行。

    return (T) entityManager.find(entityClass, id);

我的本​​机查询有问题吗? (如果Jobs.java 上没有person 列,则此查询有效)。

    StringBuilder sb = new StringBuilder();
    sb.append(" select e.* ");
    sb.append(" from ");
    sb.append("    www.job as e ");
    //sb.append(" inner join www.person_job as pj on e.id = pj.JOB_ID ");
    //sb.append(" inner join www.person as p on pj.PER_ID = p.id ");
    sb.append("  where e.id = :id ");
    Query q = entityManager.createNativeQuery(sb.toString(), JobWithDistance.class);
    q.setParameter("id", id);
    List<Job> jobs = (List<Job>) q.getResultList();

添加 2 条注释掉的行没有区别。

【问题讨论】:

【参考方案1】:

解决方案:

我需要改变:

sb.append(" select e.* ");

sb.append(" select * ");

【讨论】:

【参考方案2】:

试试这个

// in Job entity
@ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinTable(name = "person_job", joinColumns =  @JoinColumn(name = "JOB_ID") , 
                                inverseJoinColumns =  @JoinColumn(name = "PER_ID") 
)
private Person person;

...

// in Person entity
@OneToMany(mappedBy = "person")
private List<Job> jobs;

【讨论】:

好的,我已经编辑了我的答案。您可以尝试这些更改吗? 我得到:SQLException: Column 'PER_ID' not found. 我认为这与我原来的设置一样。 堆栈跟踪中还有其他内容吗?有什么可以表明 Hibernate 在哪里寻找 PER_ID 列? (default task-2) Column 'PER_ID' not found. SQLGrammarException: could not execute query java.sql.SQLException: Column 'PER_ID' not found. at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1094) 我认为它来自:@JoinColumn(name = "PER_ID"),因为如果我从Jobs.java 中删除person 列,我不会收到任何错误。

以上是关于java.sql.SQLException:找不到列“JOB_ID”的主要内容,如果未能解决你的问题,请参考以下文章

H2 java.sql.SQLException:找不到合适的驱动程序

java.sql.SQLException:找不到适合 jdbc:microsoft:sqlserver 的驱动程序

java.sql.SQLException:找不到适合 jdbc 的驱动程序:mysql://localhost:3306/dbname [重复]

java.sql.SQLException:将 Spark 数据帧保存到 Sybase 时找不到类型“TIMESTAMP”

Spring Boot + Flyway + AWS:原因:java.sql.SQLException:找不到合适的驱动程序

java.sql.SQLException: 找不到适合 jdbc:sqlserver 的驱动程序... (intellij, maven)