2016-04-24 2 views
2

здесь мои занятия юридических лиц, связанных по ManyToMany:поколение Неправильный запрос на спящий режим JPA - ManyToMany

продукта:

package fr.test; 

    import java.util.List; 

    import javax.persistence.Column; 
    import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.GenerationType; 
    import javax.persistence.Id; 
    import javax.persistence.JoinTable; 
    import javax.persistence.ManyToMany; 
    import javax.persistence.OneToMany; 
    import javax.persistence.Table; 

@Entity 
@Table(name = "product") 
public class ProductDTO { 

    @Id 
    @GeneratedValue(strategy = GenerationType.SEQUENCE) 
    @Column(name = "product_id") 
    private int id; 
     public int getId() {return id;} 
     public void setId(int id) {this.id = id;} 

    @Column(name = "nom_product") 
    private String nom; 
     public String getNom() {return nom;} 
     public void setNom(String nom) {this.nom = nom;} 

    @Column(name = "application") 
    private String application; 
     public String getGroupeApplication() {return groupeApplication;} 
     public void setGroupeApplication(String groupeApplication) {this.groupeApplication = groupeApplication;} 

    @Column(name = "grp_app") 
    private String groupeApplication; 
     public String getApplication() {return application;} 
     public void setApplication(String application) {this.application = application;} 

    @ManyToMany 
    @JoinTable(name = "product_mot_cle") 
    private List<MotCleDTO> motscleInterdits; 
     public List<MotCleDTO> getMotscleInterdits() {return motscleInterdits;} 
     public void setMotscleInterdits(List<MotCleDTO> motscleInterdits) {this.motscleInterdits = motscleInterdits;} 

    @ManyToMany 
    @JoinTable(name ="product_extension") 
    private List<ExtensionDTO> extensionsDisponibles; 
     public List<ExtensionDTO> getExtensionsDisponibles() {return extensionsDisponibles;} 
     public void setExtensionsDisponibles(List<ExtensionDTO> extensionsDisponibles) {this.extensionsDisponibles = extensionsDisponibles;} 

    @OneToMany(mappedBy="prodDiff") 
    List<DiffusionDTO> destinatairesPrincipaux; 
     public List<DiffusionDTO> getDestinatairesPrincipaux() {return destinatairesPrincipaux;} 
     public void setDestinatairesPrincipaux(List<DiffusionDTO> destinatairesPrincipaux) {this.destinatairesPrincipaux = destinatairesPrincipaux;} 

    @OneToMany(mappedBy="product") 
    private List<LivraisonDTO> prodLivr; 
     public List<LivraisonDTO> getProdLivr() {return prodLivr;} 
     public void setProdLivr(List<LivraisonDTO> prodLivr) {this.prodLivr = prodLivr;} 

    @ManyToMany(mappedBy="prodList") 
    private List<EnvironnementDTO> envList; 
     public List<EnvironnementDTO> getEnvList() {return envList;} 
     public void setEnvList(List<EnvironnementDTO> envList) {this.envList = envList;} 


    public ProductDTO() { 
    } 

    public ProductDTO(int id, String nom, String appli, String grpAppli) { 
     this.id = id; 
     this.nom = nom; 
     this.application = appli; 
     this.groupeApplication = grpAppli; 
    } 
} 

и Environnment:

@Entity 
@Table(name="environnement") 
public class EnvironnementDTO { 

    @Id 
    @GeneratedValue(strategy=GenerationType.SEQUENCE) 
    @Column(name="environnement_id") 
    private int id; 
     public int getId() {return id;} 
     public void setId(int id) {this.id = id;} 

    @Column(name="machine_alias") 
    private String machineAlias; 
     public String getMachineAlias() {return machineAlias;} 
     public void setMachineAlias(String machineAlias) {this.machineAlias = machineAlias;} 

    @Column(name="instance") 
    private String instance; 
     public String getInstance() {return instance;} 
     public void setInstance(String instance) {this.instance = instance;} 

    @Column(name="port") 
    private String port; 
     public String getPort() {return port;} 
     public void setPort(String port) {this.port = port;} 

    @OneToMany(mappedBy="environnement") 
    private List<LivraisonDTO> livrEnv; 
     public List<LivraisonDTO> getLivrEnv() {return livrEnv;} 
     public void setLivrEnv(List<LivraisonDTO> livrEnv) {this.livrEnv = livrEnv;} 

    @ManyToMany 
    @JoinTable(name="lien_product_environnement", 
    [email protected](name="environnement_id", referencedColumnName="environnement_id"), 
    [email protected](name="product_id",referencedColumnName="product_id")) 
    private List<ProductDTO> prodList; 
     public List<ProductDTO> getProdList() {return prodList;} 
     public void setProdList(List<ProductDTO> prodList) {this.prodList = prodList;} 


    public EnvironnementDTO() { 
    } 

    public EnvironnementDTO(int id, String machineAlias, String instance, String port) { 
     this.id = id; 
     this.machineAlias = machineAlias; 
     this.instance = instance; 
     this.port = port; 
    } 



} 

здесь мой JPQL запрос:

SELECT env FROM EnvironnementDTO env JOIN ProductDTO p WHERE p.id=2 

Сформированный запрос на Postgres является следующее:

select environnem0_.environnement_id as environn1_3_, environnem0_.instance as instance2_3_, environnem0_.machine_alias as machine_3_3_, environnem0_.port as port4_3_ from environnement environnem0_ inner join product productdto1_ on where productdto1_.product_id=2 

, как вы можете увидеть: SQL, выполняется на Postgres дота не следует таблицам отображения для многих ко многим обозначаются в @JoinTable на EnvironnementDTO .. ​​

Мы дважды проверенные аннотации, кажется, что jpa или hibernate не используют их для генерации хорошего запроса!

Я знаю, что это определенно ошибка на моей стороне ... но не понимаю, что происходит.

+0

Может быть, это помогает http://stackoverflow.com/questions/13485752/jpql-and-join-table – RubioRic

ответ

2

Вы должны упомянуть ассоциацию, на которой вы хотите присоединиться в запросе

SELECT env FROM EnvironnementDTO env JOIN env.prodList p WHERE p.id=2 
Смежные вопросы