我有关于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>();
类中的用户是类中最后一个有多对多的关联,并且类载体中的最后一个关联 并感谢您的帮助
答案 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。
正确命名是非常重要的。如果你以不同的方式命名所有字段,你将不断在任何地方犯错误,因为你永远不会记得你如何命名它们。并且代码很难按原样阅读。