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

Query jpql to get value of table generated by ManyToMany association

我在 mysql 上有 table 由 ManyToMany 关联生成。这个 table 是 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'

我收到这个错误:

:table user_carrier is not mapped

我想是因为它不是class,它只是一个由ManyToMany关联生成的table关联,但是我能做什么呢?

class 运营商是:

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

table 用户是:

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

在 class 用户中是 class 中的最后一个关联,其中您有多对多并且在 class 运营商中也是最后一个关联 谢谢你的帮助

正如我在评论中所说:JPQL 从不使用 table 和列名。始终是实体名称及其 fields/associations.

select c from client c

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

inner join c.utilisateur_transportcat

这又是错误的:Client class.

中没有名为 utilisateur_transportcat 的字段

您只需要在客户端实体及其关联的 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),CID`(不正确:所有大写字母都保留给常量)。

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

private List<Paiement> paiements = new ArrayList<Paiement>();

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

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