【问题标题】:Select from with boolean functions使用布尔函数选择
【发布时间】:2016-08-30 11:36:39
【问题描述】:

我正在尝试使用 Java EE 开发应用程序。这是我想要实现的类图的一部分:

下面是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;
    }

...

我还实现了 Module Class 和 ModulePK。 我想检查一下老师是否应该被分配到一个班级一次。 我尝试使用以下 JPQL 查询

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

但是当我执行该方法时,我有这个异常

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]

【问题讨论】:

  • 请显示类 domain.Module

标签: java hibernate many-to-many jpql


【解决方案1】:

您忘记使用 : 来指示您的命名参数,因此您使用的是 idEnseignant=idEnseignant 而不是 idEnseignant=:idEnseignant

这是更正后的代码:

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

【讨论】:

    【解决方案2】:

    在您的Module 实体中,您将modulePk 定义为主键。使用此 ID 有两种可能性:

    • 创建ModulePk 类的实例并将其传递给实体管理器的find() 方法(在您的查询中并非如此),或者

    • 要在 JPQL 查询中使用它,您必须遍历嵌入的 id 类。在您的情况下,按如下方式使用它:

      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";
      

    【讨论】:

      【解决方案3】:

      @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;
      }
      

      }

      这是 ModulePK 类

      @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);
      }
      ...
      

      【讨论】:

        猜你喜欢
        • 2021-01-29
        • 2021-08-23
        • 2011-04-12
        • 2015-05-30
        • 1970-01-01
        • 2018-02-08
        • 1970-01-01
        • 2015-04-29
        • 2020-04-02
        相关资源
        最近更新 更多