查询jpql以获取ManyToMany关联生成的表的值

时间:2015-12-17 16:59:36

标签: mysql jboss7.x jpql ejb-3.1

我有关于ManyToMany关联生成的mysql的表。此表为user_carrier,但是当我运行此查询时:

select c from client c
inner join c.utilisateur_transportcat utc 
inner join utc.transportcat tc
inner join tc.transport t
where t.intitule like 'byroad'

我收到此错误:

  

:表user_carrier未映射

我认为这是因为它不是一个类,它只是一个由ManyToMany协会生成的表关联,但我该怎么办?

班级承运人是:

@Entity
@Table(name="TransportCat")
public class TransportCat {

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Integer IdTransportCat;
    private String Intitule;
    @Lob @Basic(fetch=FetchType.LAZY, optional=false)
    private String Description;
    private String iconImage;
    private boolean Statut;

    @ManyToOne
    @JoinColumn(name="IdTransport")
    private Transport transport;


    @ManyToMany(mappedBy="listTransportTrCat")
    private List<Client> listClient=new ArrayList<Client>();

表用户是:

@Entity
@DiscriminatorValue(value="client")
public class Client extends Utilisateur{

    //champs client privé
    private String Nom;
    private String Prenom;

    //question 
        @OneToMany(mappedBy="client",fetch=FetchType.LAZY,cascade=CascadeType.ALL,orphanRemoval=true)
        private  List<Question> listeQuestion=new ArrayList<Question>();

    //liste des abonnements d'un utilisateur
        @OneToMany(mappedBy="pk.client",fetch=FetchType.LAZY,orphanRemoval=true)
        private List<Commission_Client> listeCommissionClient=new ArrayList<Commission_Client>();

    /*@OneToMany(mappedBy="pk.client",fetch=FetchType.LAZY)
    private List<Abon_Comm_Client> listeAbonnement=new ArrayList<Abon_Comm_Client>();*/


    //liste des  factures
    @OneToMany(mappedBy="client",fetch=FetchType.LAZY)
    private List<Facture> listeFacture=new ArrayList<Facture>();

    //geolocalisation
    @OneToMany(mappedBy="client")
    private List<geolocalisation> listeGeolocalisations=new ArrayList<geolocalisation>();


    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="IdVille_usr")
    private Ville Ville_Utilisateur;

    //déclaration
    @OneToMany(mappedBy="Transporteur",fetch=FetchType.LAZY)
    private List<Declaration> listeDeclaration=new ArrayList<Declaration>();


    //clients
    @OneToMany(mappedBy="client",fetch=FetchType.LAZY)
    private List<Paiement> listePaiement=new ArrayList<Paiement>();

    private String CodePost_usr;
    private String Rue_usr;
    private String Telephone_usr;
    private String Mobile_usr;
    private Long CID;
    private Date dateCr;
    //commentaire
    @Lob @Basic(fetch=FetchType.LAZY, optional=false)
    private String Comment;

    //champs pour un client proffessionnel

    public List<Paiement> getListePaiement() {
        return listePaiement;
    }


    public void setListePaiement(List<Paiement> listePaiement) {
        this.listePaiement = listePaiement;
    }




    private String position;
    //proffessionnelle ou priv�
    private String Type_client;

    //Transporteur ou expediteur
    private String TranExp;

    //� propos de la soci�t�
    private String Nom_Societe;
    private String Details_Societe;

    @ManyToOne
    @JoinColumn(name="id")
    private Langue langue;

    @ManyToOne
    @JoinColumn(name="idIndustrie")
    private Industrie industrie;

    //type de service local national international pour un transporteur
    private String ServiceType;

    //ville societe
    @ManyToOne
    @JoinColumn(name="IdVille_Societe")
    private  Ville ville_Societe;

    private String CodePost_Societe;
    private String Rue_Societe;

    private String Telephone_societe;
    private String Fax;
    private String Organization_Number;


    @OneToMany(mappedBy="Client",cascade=CascadeType.ALL,orphanRemoval=true,fetch=FetchType.LAZY)
    List<GLN> list_GLN=new ArrayList<GLN>();

    //assurance
    private String Assurance_Societe;
    private String Assurance_Adresse;
    private String Assurance_Policy_Number;
    private String Assurance_montant;
    private String Assurance_Contact_phone;
    private Date Asssurance_Expiration;



    @ManyToOne
    @JoinColumn(name="idVille_Postal")
    private Ville ville_postal;

    private String CodePost_Postal;
    private String Rue_Postal;


    //Expediteur
    private String Web_Site;

    //Transporteur


    @ManyToMany(cascade=CascadeType.ALL)
    private  List<TransportCat> listTransportTrCat=new ArrayList<TransportCat>();
类中的

用户是类中最后一个有多对多的关联,并且类载体中的最后一个关联 并感谢您的帮助

1 个答案:

答案 0 :(得分:0)

正如我在评论中所说:JPQL从不使用表名和列名。始终是实体名称及其字段/关联。

select c from client c

这已经错了。该实体的名称为Client,而不是client

inner join c.utilisateur_transportcat

这又错了:utilisateur_transportcat类中没有名为Client的字段。

您只需要在Client实体及其关联的TransportCat之间进行连接。这两个实体之间的关联定义为

@ManyToMany(cascade=CascadeType.ALL)
private List<TransportCat> listTransportTrCat = new ArrayList<TransportCat>();

所以查询只是

select c from Client c
join c.listTransportTrCat tc
inner join tc.transport t
where t.intitule = 'byroad'

我强烈建议学习Java命名约定并坚持使用它们。您的所有字段都使用不同的字段:iconImage(正确),Statut(不正确:应以小写字母开头),Telephone_societe(错误:不应该有下划线,应该是telephoneSociete {{ 1}} CID`(不正确:所有大写都保留给常量)。

同样选择一种语言,英语,并坚持使用,而不是随意混合法语和英语单词。对于List类型的字段,请不要将字段命名为listXXX。只需使用复数形式:

),

不要使用abbraviations。 TransportCat没有任何意义。如果Cat表示类别,则将类命名为TransportCategory。

正确命名是非常重要的。如果你以不同的方式命名所有字段,你将不断在任何地方犯错误,因为你永远不会记得你如何命名它们。并且代码很难按原样阅读。