spring data jpa-error-with enum type参数

6za6bjd0  于 2021-07-14  发布在  Java
关注(0)|答案(1)|浏览(382)

以下代码有问题

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,但是不符合我的安全性要求

yws3nbqq

yws3nbqq1#

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

@Query(value = "SELECT idLogin, identifiant, societe, loginRole FROM Login")
List<Login> findListIdentifiant();

更改为:

@Query(value = "SELECT l FROM Login l")
List<Login> findListIdentifiant();

但是这个查询是多余的,因为有一个 findAll() jparepository上的方法就是这样做的。

相关问题