hibernate JPA生成错误的查询 - ManyToMany

时间:2016-04-24 16:47:37

标签: java hibernate postgresql 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", 
    joinColumns=@JoinColumn(name="environnement_id", referencedColumnName="environnement_id"),
    inverseJoinColumns=@JoinColumn(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

正如您所看到的:在postgres上执行的sql不遵循映射表,在EnvironnementDTO上的@JoinTable中指定了多对多..

我们仔细检查了我们的注释,似乎jpa或者hibernate不使用它们来生成好的查询!

我知道这肯定是我身边的错误......但不了解发生了什么。

1 个答案:

答案 0 :(得分:2)

您必须提及要在查询中加入的关联

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