在查询、jpa 存储库和 spring 引导中使用非硬编码值

Using not hard coded values in query, jpa repository and spring boot

我在我的 spring 引导项目中使用硬编码值查询,这很好:

    @Query("select user from Users user where user.mobileNumber=?1 and not user.status=-2")
Users FindNotDeletedUserByMobileNumber(String MobileNumber);

但是,我想使用非硬编码值,例如。从枚举中读取,我试过这个:

    @Query("select user from Users user where user.mobileNumber=?1 and not user.status=com.taxikar.enums.User_Status.Deleted")
Users FindNotDeletedUserByMobileNumber(String MobileNumber)

但是这个在构建时出错:

'userRepository': Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Validation failed for query for method public abstract com.taxikar.entity.Users com.taxikar.repository.UserRepository.FindNotDeletedUserByMobileNumber(java.lang.String)!
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:588) ~[spring-beans-4.3.14.RELEASE.jar:4.3.14.RELEASE]

我在我的其他 classes 中使用了这个枚举值,它们工作正常,例如:

if (user.getStatus() == User_Status.Deleted.getId())
            return new BaseResponse(BR_Status.error.getId(), BR_ErrorCodes.NotAuthorizedUser.getStringValue() + "01",
                    "error 755", user.getId());

即使像上面那样使用 .getId.getStringValue,但在我的查询结束时也没有解决任何问题。我做错了什么?

这是我的枚举代码:

    public enum User_Status implements IResponse
{
    Deleted(-2),
    Unauthorized(-1),
    NotCompleteGeneralInfo(0),
    CompleteGeneralInfo(1);

    private int value;
    private String stringValue;

    User_Status(int value)
    {
        this.value = value;
    }
    User_Status(String stringValue){this.stringValue=stringValue;}
    @Override
    public int getId()
    {
        return value;
    }

    @Override
    public String getStringValue()
    {
        return stringValue;
    }
}

这个枚举实现 IResponse 是这样的:

public interface IResponse
{
    String getStringValue();

    int getId();
}

这是我的存储库:

public interface UserRepository extends JpaRepository<Users, String>
{
    @Query("select user from Users user where user.mobileNumber=?1 and not user.status=com.taxikar.enums.User_Status.Deleted")
    Users FindNotDeletedUserByMobileNumber(String MobileNumber);
}

这是我的实体 class :

    @Entity
@Table(name = "users")
public class Users
{
    // these fields are feed by us not the user
    @Id
    @GeneratedValue(generator = "uuid2")
    @Column(columnDefinition = "char(36)")
    @GenericGenerator(name = "uuid2", strategy = "uuid2")
    private String id;
    @Column(name = "STATUS") // User status ===>-2: Deleted , -1: unauthorized  , 0: user info is not complete ,  1: complete user
    private int status;
    @Column(name = "RATE")
    private String rate;

    //Not Optional fields
    @Column(name = "FIRST_NAME")
    private String firstName;
    @Column(name = "LAST_NAME")
    private String lastName;
    @Column(name = "SEX") // Sex ====> 1:women 2:men
    private int sex;
    @Column(name = "MOBILE_NUMBER")
    private String mobileNumber;
    @Column(name = "USER_IMG")
    private String userImg;
    @Column(name = "IDENTITY_NUMBER")
    private String identityNumber;
    @Column(name = "USER_IDENTITY_CARD_IMG")
    private String userIdentityCardImg;


    //Optional fields
    @Column(name = "EMAIL")
    private String email;
    @Column(name = "BIRTHDAY")
    private String birthday;
    @Column(name = "DESCRIPTION")
    private String description;

    // not Optional fields for driver
    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "DRIVER_DETAIL")
    private DriverDetail driverDetail;

    //Login related fields
    @Column(name = "TOKEN")
    private String token;
    @Column(name = "TOKEN_TIMESTAMP")
    private Timestamp tokenTimeStamp;
    @Column(name="SMS_COUNT")
    private int smsCount;
    @Column(name="SMS_COUNT_TIMESTAMP")
    private Timestamp smsCountTimeStamp;

    +++ constructor and setters and getters. 

    }

试试这个:

@Query("select user from Users user where user.mobileNumber=?1 and user.status<>?2")
Users FindNotDeletedUserByMobileNumber(String MobileNumber, int status);

并在调用该存储库方法时传入 -2 作为参数