繁体   English   中英

在Spring JpaRepository中使用DiscriminatorColumn的JPQL查询导致QuerySyntaxException:未映射xxx

[英]JPQL query using a DiscriminatorColumn in Spring JpaRepository results in QuerySyntaxException: xxx is not mapped

我想选择具有CLIENT角色的用户,但出现此错误:

由以下原因引起:org.hibernate.hql.internal.ast.QuerySyntaxException:utilisateur未映射到org.hibernate.hql.internal.ast.QuerySyntaxException.generateQueryException(QuerySyntaxException。从utilisateur中选择u.role =:CLIENT)。 java:79)〜[hibernate-core-5.3.10.Final.jar:5.3.10.Final] at org.hibernate.QueryException.wrapWithQueryString(QueryException.java:103)〜[hibernate-core-5.3.10.Final .jar:5.3.10.Final]位于org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:219)〜[hibernate-core-5.3.10.Final.jar:5.3.10.Final]在org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:143)〜[hibernate-core-5.3.10.Final.jar:5.3.10.Final] ...

Utilisateur.java:

// imports omitted for brevity
    @Entity
    @Table(name="UTILISATEURS")
    @Inheritance(strategy=InheritanceType.SINGLE_TABLE)
    @DiscriminatorColumn(name="ROLE")
    public class Utilisateur implements Serializable 
    {
        @Id
        @GeneratedValue(strategy=GenerationType.IDENTITY)
           private long codeUtilisateur;
           private String cin;
           private String nom;
           private String prenom;
           private String username;
           private String password;
           private String telephone;
           private String ville;
           private Boolean actif;
           private String adresse;
        @DateTimeFormat(pattern = "dd/MM/yyyy")
           private Date dateNaissance;
           private String email;
           private char genre;

           public Utilisateur() {
            super();
        }

        public Utilisateur(long code) {
            this.codeUtilisateur = code;
        }



        public Utilisateur(String cin, String nom, String prenom, String telephone, String email, char genre, Boolean actif) {
            super();
            this.cin = cin;
            this.nom = nom;
            this.prenom = prenom;
            this.telephone = telephone;
            this.email = email;
            this.genre = genre;
            this.actif = actif;
        }

        public Utilisateur(String cin, String nom, String prenom, String username, String password, String telephone,
                String ville, String adresse, Date dateNaissance, String email, char genre, Boolean actif) {
            super();
            this.cin = cin;
            this.nom = nom;
            this.prenom = prenom;
            this.username = username;
            this.password = password;
            this.telephone = telephone;
            this.ville = ville;
            this.adresse = adresse;
            this.dateNaissance = dateNaissance;
            this.email = email;
            this.genre = genre;
            this.actif = actif;
        }
// getters/setters omitted for brevity
    }

UtilisateurRepository.java:

// imports omitted for brevity

    public interface UtilisateurRepository extends JpaRepository <Utilisateur,Long> {
        @Query ("SELECT u FROM utilisateurs u WHERE u.role=:CLIENT")
           public List<Client> getClients();
    }

我看到您的存储库有几个问题。

  1. 您在JPQL查询中使用表名而不是Entity名。
  2. 您试图选择一个Utilisateur对象List ,但是getClients()的签名返回List<Client>而不是List<Utilisateur>
  3. 您试图将角色与一个替代值( :CLIENT )进行匹配,该替代值不属于getClients()签名的一部分。

您正在使用以下注释将Utilisateur配置Utilisateur

@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="ROLE")

因此,假设您至少有一个Utilisateur子类Client ,您正在尝试查询该子类:

@Entity
public class Client extends Utilisateur {...}

在这种情况下,请尝试以下操作:

public interface UtilisateurRepository extends JpaRepository <Utilisateur,Long> {
    @Query ("SELECT u FROM Utilisateur u WHERE TYPE(u) = Client")
    public List<Utilisateur> getClients();
}

否则,您可能希望有一个单独的ClientRepository:

public interface ClientRepository extends JpaRepository<Client,Long> {
    // in which case you can just take advantage of findAll
    // which is already provided by JpaRepository
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM