2016-05-04 4 views
0

Ich versuche, eine Anwendung mit Java EE zu entwickeln. Hier ist ein Teil meines Klassendiagramm, das ich umsetzen will:Wählen Sie aus mit booleschen Funktionen

enter image description here

Hier ist die Implementierung von Klassen mit Hibernate:

@Entity 
@Table(name = "t_enseignant") 
public class Enseignant extends User implements Serializable { 


private static final long serialVersionUID = 1L; 

    private String specialite; 
    private List<Module> modules; 

    public Enseignant() { 
    } 

    public Enseignant(String nom, String prenom, String email, String login, String password, String specialite) { 
     super(nom, prenom, email, login, password); 
     this.setSpecialite(specialite); 
    } 

    public String getSpecialite() { 
     return specialite; 
    } 

    public void setSpecialite(String specialite) { 
     this.specialite = specialite; 
    } 

    @OneToMany(mappedBy = "enseignant") 
    public List<Module> getModules() { 
     return modules; 
    } 

    public void setModules(List<Module> modules) { 
     this.modules = modules; 
    } 
} 

@Entity 
@Table(name = "t_classe") 
public class Classe implements Serializable { 

    private static final long serialVersionUID = 1L; 

    private int id; 
    private String niveau; 
    private int nbreEtudiant; 

    private List<Module> modules; 

    public Classe() { 
    } 

    public Classe(String niveau, int nbreEtudiant) { 
     this.niveau = niveau; 
     this.nbreEtudiant = nbreEtudiant; 
    } 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    public int getId() { 
     return id; 
    } 

... 

ich auch die Module Class und ModulePK umgesetzt. Ich möchte überprüfen, ob ein Lehrer einmal einer Klasse zugewiesen werden sollte. Ich habe versucht, mit der folgenden JPQL Abfrage

boolean exists = false; 
    String jpql = "select case when (count(m) > 0) then true else false end from Module m where m.idEnseignant=idEnseignant and m.idClasse=idClasse"; 
    TypedQuery<Boolean> query = entityManager.createQuery(jpql, Boolean.class); 
    query.setParameter("idEnseignant", enseignant.getId()); 
    query.setParameter("idClasse", classeToValidate.getId()); 
     exists = query.getSingleResult(); 

aber wenn ich die Methode ausführen Ich habe diese Ausnahme

could not resolve property: idEnseignant of: domain.Module [select case when  (count(m) > 0) then true else false end from domain.Module m where m.idEnseignant=idEnseignant and m.idClasse=idClasse] 
+0

Bitte zeigen Klasse domain.Module – Jens

Antwort

0

@jens

@Entity 
@Table(name = "t_module") 
public class Module implements Serializable { 
private static final long serialVersionUID = 1L; 

private ModulePk modulePk; 
private String nomModule; 
private int nbreHeure; 
private Enseignant enseignant; 
private Classe classe; 

public Module() { 
} 

public Module(String nomModule, int nbreHeure, Enseignant enseignant, Classe classe) { 
    this.nomModule = nomModule; 
    this.nbreHeure = nbreHeure; 
    this.enseignant = enseignant; 
    this.classe = classe; 
    this.modulePk = new ModulePk(enseignant.getId(), classe.getId()); 
} 

@EmbeddedId 
public ModulePk getModulePk() { 
    return modulePk; 
} 

public void setModulePk(ModulePk modulePk) { 
    this.modulePk = modulePk; 
} 

public String getNomModule() { 
    return nomModule; 
} 

public void setNomModule(String nomModule) { 
    this.nomModule = nomModule; 
} 

public int getNbreHeure() { 
    return nbreHeure; 
} 

public void setNbreHeure(int nbreHeure) { 
    this.nbreHeure = nbreHeure; 
} 

@ManyToOne 
@JoinColumn(name = "idEnseignant", referencedColumnName = "id", insertable = false, updatable = false) 
public Enseignant getEnseignant() { 
    return enseignant; 
} 

public void setEnseignant(Enseignant enseignant) { 
    this.enseignant = enseignant; 
} 

@ManyToOne 
@JoinColumn(name = "idClasse", referencedColumnName = "id", insertable = false, updatable = false) 
public Classe getClasse() { 
    return classe; 
} 

public void setClasse(Classe classe) { 
    this.classe = classe; 
} 

}

und das ist ModulePK Klasse

@Embeddable 
public class ModulePk implements Serializable { 

private static final long serialVersionUID = 1L; 

private int idEnseignant; 
private int idClasse; 

public ModulePk() { 
} 

public ModulePk(int idEnseignant, int idClasse) { 
    this.setIdEnseignant(idEnseignant); 
    this.setIdClasse(idClasse); 
} 
... 
1

vergessen Sie auf die : Ihre benannte Parameter, um anzuzeigen, so musste man idEnseignant=idEnseignant statt idEnseignant=:idEnseignant

Hier ist der korrigierte Code:

boolean exists = false; 
String jpql = "select case when (count(m) > 0) then true else false end from Module m where m.idEnseignant=:idEnseignant and m.idClasse=:idClasse"; 
TypedQuery<Boolean> query = entityManager.createQuery(jpql, Boolean.class); 
query.setParameter("idEnseignant", enseignant.getId()); 
query.setParameter("idClasse", classeToValidate.getId()); 
exists = query.getSingleResult(); 
return exists 
1

In Ihrem Module Objekt, das Sie definieren modulePk die primäre zu sein Schlüssel. Es gibt zwei Möglichkeiten diese ID zu verwenden:

  • eine Instanz ModulePk Klasse erstellen und an die find() Methode der Unternehmens-Manager übergeben (die in Ihrer Abfrage nicht der Fall ist), oder

  • Um es in der JPQL-Abfrage zu verwenden, müssen Sie die eingebettete ID-Klasse durchlaufen. In Ihrem Fall ist es wie folgt verwenden:

    String jpql = "select case when (count(m) > 0) then true else false end from Module m where m.modulePk.idEnseignant = :idEnseignant and m.modulePk.idClasse = :idClasse"; 
    
+0

thank you alot es funktioniert :) –

Verwandte Themen