Java Spring数据jpa-错误-带有枚举类型参数

Java Spring数据jpa-错误-带有枚举类型参数,java,spring,jpa,spring-data-jpa,Java,Spring,Jpa,Spring Data Jpa,我对以下代码有问题 org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'loginController' defined in file [C:\Users\USERNAME\IdeaProjects...\application\ui\security\controller\LoginController.class]: Unsatisfied depe

我对以下代码有问题

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'loginController' defined in file [C:\Users\USERNAME\IdeaProjects...\application\ui\security\controller\LoginController.class]: Unsatisfied dependency expressed through constructor parameter 2; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'loginServiceImpl' defined in file [C:\Users\USERNAME\IdeaProjects\...\core\domain\login\LoginServiceImpl.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'loginRepository' defined in be.mypackage.core.persistence.LoginRepository defined in @EnableJpaRepositories declared on DomainConfig: Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Validation failed for query for method public abstract java.util.List be.mypackage.core.persistence.LoginRepository.findListIdentifiant()!

Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'loginServiceImpl' defined in file [C:\Users\USERNAME\IdeaProjects\....\core\domain\login\LoginServiceImpl.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'loginRepository' defined in be.mypackage.core.persistence.LoginRepository defined in @EnableJpaRepositories declared on DomainConfig: Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Validation failed for query for method public abstract java.util.List be.mypackage.core.persistence.LoginRepository.findListIdentifiant()!

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'loginRepository' defined in be.mypackage.core.persistence.LoginRepository defined in @EnableJpaRepositories declared on DomainConfig: Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Validation failed for query for method public abstract java.util.List be.mypackage.core.persistence.LoginRepository.findListIdentifiant()!

Caused by: java.lang.IllegalArgumentException: Validation failed for query for method public abstract java.util.List be.mypackage.core.persistence.LoginRepository.findListIdentifiant()!


Caused by: java.lang.IllegalArgumentException: org.hibernate.QueryException: No data type for node: org.hibernate.hql.internal.ast.tree.IdentNode 
 \-[IDENT] IdentNode: 'loginRole' {originalText=loginRole}


Caused by: org.hibernate.QueryException: No data type for node: org.hibernate.hql.internal.ast.tree.IdentNode 
 \-[IDENT] IdentNode: 'loginRole' {originalText=loginRole}
我试图从表中检索一些值,但不是全部。我有这个错误。 我不想使用@Transient,因为它会阻止我在其他时间检索密码值

问题似乎出在enum字段上,如果我使用适当的构造函数将其从查询中删除,则在启动程序时查询不再返回错误

一定有一些简单的事情我做得不对

我的请求jpa

导入be.mypackage.core.domain.login.login;
导入org.springframework.data.jpa.repository.JpaRepository;

导入org.springframework.data.jpa.repository.Query;

导入java.util.List;


公共接口LoginRepository扩展了JpaRepository{
@查询(value=“从登录中选择idLogin、identifiant、societe、loginRole”)

列出findListIdentifiant();
}
我的类实体登录

package be.mypackage.core.domain.login;
导入be.mypackage.core.domain.societe.societe;
导入org.hibernate.annotations.SQLDelete;
导入org.hibernate.annotations.Where;
导入javax.persistence.Column;
导入javax.persistence.Entity;
导入javax.persistence.EnumType;
导入javax.persistence.Enumerated;
导入javax.persistence.FetchType;
导入javax.persistence.GeneratedValue;
导入javax.persistence.GenerationType;
导入javax.persistence.Id;
导入javax.persistence.JoinColumn;
导入javax.persistence.manytone;
导入javax.persistence.PrePersist;
导入javax.persistence.Transient;
@实体
@SQLDelete(sql=“更新登录集状态”\u actif=false,其中id\u login=?”)
@其中(子句=“状态”\u活动“假”)
公共类登录{
@身份证
@列(nullable=false,Updateable=false)
@GeneratedValue(策略=GenerationType.IDENTITY)
私有整数idLogin;
@列(长度=100,唯一性=true)
私有字符串标识符;
//@短暂的
@列(长度=100)
私有字符串motDePasse;
@manytone(fetch=FetchType.LAZY)//确定
@JoinColumn(name=“no_societe”,null=false)
私人兴业银行;
@短暂的
@列(name=“status\u actif”,nullable=false)
私有布尔状态actif;
@预科生
公共无效fixStatusActif(){
this.statusActif=true;
}
@枚举(EnumType.STRING)
@列(name=“role”,unique=true,长度=30)
私人登录用户登录用户;
公共登录(){
}
//jpa请求使用此构造函数
公共登录(整数idLogin、字符串标识符、兴业银行){
this.idLogin=idLogin;
this.identiant=identiant;
这个。兴业银行=兴业银行;
}
//不行
公共登录(整数idLogin、字符串标识符、兴业银行、LoginRole LoginRole){
this.idLogin=idLogin;
this.identiant=identiant;
这个。兴业银行=兴业银行;
this.loginRole=loginRole;
}
公共整数getIdLogin(){
返回idLogin;
}
public void setIdLogin(整数idLogin){
this.idLogin=idLogin;
}
公共字符串getIdentification(){
返回标识;
}
公共无效设置标识符(字符串标识符){
this.identiant=identiant;
}
公共字符串getMotDePasse(){
返回莫德帕斯;
}
公共void setMotDePasse(字符串motDePasse){
this.motdepase=motdepase;
}
公共布尔getStatusActif(){
返回状态ACTIF;
}
public void setStatusActif(布尔状态Actif){
this.statusActif=statusActif;
}
公共兴业银行{
回归兴业银行;
}
法国兴业银行(Societe Societe){
这个。兴业银行=兴业银行;
}
公共LoginRole getLoginRole(){
返回登录角色;
}
public void setLoginRole(LoginRole LoginRole){
this.loginRole=loginRole;
}
@凌驾
公共字符串toString(){
返回标识;
}
}
类枚举

package be.mypackage.core.domain.login;


公共枚举登录名{

    
角色(行政),
    
职位经理,
    
角色(员工),
    
员工的角色;


}

我的表格登录



findAll查询可以很好地处理enum,但我不能从查询中排除密码


正如您所看到的,角色(枚举)字段在findAll中很容易获得,但不符合我的安全要求

您不必在查询中列出属性:

@Query(value = "SELECT idLogin, identifiant, societe, loginRole FROM Login")
List<Login> findListIdentifiant();
@Query(value=“从登录中选择idLogin、identifiant、societe、loginRole”)
列出findListIdentifiant();
改为:

@Query(value = "SELECT l FROM Login l")
List<Login> findListIdentifiant();
@Query(value=“从登录名l中选择l”)
列出findListIdentifiant();

但是这个查询是多余的,因为JpaRepository上有一个
findAll()
方法正好可以做到这一点。

findAll查询可以很好地处理enum,但我不能从查询中排除密码(请参阅文章中的图片)这是一个问题?我的意思是,密码不是加密的吗?如果你想在REST API中返回它,你可以添加@JsonIgnore以将其从序列化中排除否,密码没有加密,这是管理员要求的一部分…恢复应用程序密码。(是的,这不是很好)但是你的评论还不错,我会把它提交给我的经理。而且这是一个swing应用程序。有没有办法用jpa获得enum?(但他说这是从2.1版开始支持的)问题是您无法加载部分实体。但是您可以创建一个包含所有属性的构造函数的常规类。您知道构造函数表达式是如何工作的吗?请使用nativeQuery=true进行尝试,就像今晚我将尝试这样做一样,但我想我必须手动重新进行映射。