以下代码有问题
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
import be.mypackage.core.domain.login.Login;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import java.util.List;
public interface LoginRepository extends JpaRepository<Login, Integer> {
@Query(value = "SELECT idLogin, identifiant, societe, loginRole FROM Login")
List<Login> findListIdentifiant();
}
我的类实体登录
package be.mypackage.core.domain.login;
import be.mypackage.core.domain.societe.Societe;
import org.hibernate.annotations.SQLDelete;
import org.hibernate.annotations.Where;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.PrePersist;
import javax.persistence.Transient;
@Entity
@SQLDelete(sql = "UPDATE login SET status_actif = false WHERE id_login=?")
@Where(clause = "status_actif <> 'false'")
public class Login {
@Id
@Column(nullable = false, updatable = false)
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer idLogin;
@Column(length = 100, unique = true)
private String identifiant;
//@Transient
@Column(length = 100)
private String motDePasse;
@ManyToOne(fetch = FetchType.LAZY) // OK
@JoinColumn(name = "no_societe", nullable = false)
private Societe societe;
@Transient
@Column(name = "status_actif", nullable = false)
private Boolean statusActif;
@PrePersist
public void fixStatusActif() {
this.statusActif = true;
}
@Enumerated(EnumType.STRING)
@Column(name = "role", unique = true, length = 30)
private LoginRole loginRole;
public Login() {
}
// jpa request work with this constructor
public Login(Integer idLogin, String identifiant, Societe societe) {
this.idLogin = idLogin;
this.identifiant = identifiant;
this.societe = societe;
}
// not work
public Login(Integer idLogin, String identifiant, Societe societe, LoginRole loginRole) {
this.idLogin = idLogin;
this.identifiant = identifiant;
this.societe = societe;
this.loginRole = loginRole;
}
public Integer getIdLogin() {
return idLogin;
}
public void setIdLogin(Integer idLogin) {
this.idLogin = idLogin;
}
public String getIdentifiant() {
return identifiant;
}
public void setIdentifiant(String identifiant) {
this.identifiant = identifiant;
}
public String getMotDePasse() {
return motDePasse;
}
public void setMotDePasse(String motDePasse) {
this.motDePasse = motDePasse;
}
public Boolean getStatusActif() {
return statusActif;
}
public void setStatusActif(Boolean statusActif) {
this.statusActif = statusActif;
}
public Societe getSociete() {
return societe;
}
public void setSociete(Societe societe) {
this.societe = societe;
}
public LoginRole getLoginRole() {
return loginRole;
}
public void setLoginRole(LoginRole loginRole) {
this.loginRole = loginRole;
}
@Override
public String toString() {
return identifiant;
}
}
类枚举
package be.mypackage.core.domain.login;
public enum LoginRole {
ROLE_ADMIN,
ROLE_MANAGER,
ROLE_EMPLOYEE,
ROLE_EMPLOYEE_READ;
}
我的表登录
findall查询可以很好地处理enum,但我不能从查询中排除密码
正如您所看到的,role(enum)字段对于findall来说是很好的getter,但是不符合我的安全性要求
1条答案
按热度按时间yws3nbqq1#
您不必在查询中列出属性:
更改为:
但是这个查询是多余的,因为有一个
findAll()
jparepository上的方法就是这样做的。