2016-08-31 1 views
0

J'utilise Java8 avec JPA2/Hibernate5, Spring4 et mySQL.java.sql.SQLException: Colonne 'JOB_ID' introuvable

Si quelqu'un peut aider, je l'apprécierais.

J'ai les tableaux suivants.

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

Un person peut avoir beaucoup 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 suivante fonctionne très bien quand je le lance directement contre la base de données:

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 
... 

Quand je lance une requête native (avec SQL ci-dessus), J'obtiens l'erreur suivante:

java.sql.SQLException: Column 'JOB_ID' not found.

Dans Job.java, si j'échanger les JOB_ID et PER_ID autour du @JoinTable, puis-je obtenir:

java.sql.SQLException: Column 'PER_ID' not found.

Comme ci-dessus SQL fonctionne très bien contre la base de données, je pense que le problème est avec JOIN configuration emploi .java.


MISE À JOUR

J'ai également le suivant qui fonctionne correctement:

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

Un job peut avoir beaucoup 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; 

MISE À JOUR

-je obtenir que cette erreur quand j'exécute une requête native. Quand je fais l'exemple suivant, ça fonctionne parfaitement.

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

Y at-il un problème avec ma requête native? (Cette requête fonctionne si je n'ai pas la colonne person sur Jobs.java). Ajouter les deux lignes commentées ne fait pas de différence.

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(); 

Répondre

0

Essayez avec cette

// 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; 
+0

OK, je l'ai modifié ma réponse. Pouvez-vous essayer avec ces changements? –

+0

Je reçois: 'SQLException: Column 'PER_ID' non trouvé.' Je pense que cela fait la même chose que ma configuration originale. – Richard

+0

Autre chose dans la pile de pile? Quelque chose qui indiquerait où Hibernate recherche la colonne 'PER_ID'? –

0

SOLUTION:

je devais changer:

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

à

sb.append(" select * ");