【问题标题】:Using not hard coded values in query, jpa repository and spring boot在查询、jpa 存储库和 Spring Boot 中使用非硬编码值
【发布时间】:2019-01-15 08:38:59
【问题描述】:

我在我的 Spring Boot 项目中使用硬编码值的查询,这很好:

    @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]

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

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);
}

这是我的实体类:

    @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. 

    }

【问题讨论】:

  • 我什至搜索了很多,我找到了一些像这里所说的解决方案:link 但没有一个对我有用!

标签: java spring spring-boot spring-data-jpa jpql


【解决方案1】:

试试这个:

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

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

【讨论】:

  • 是的,谢谢,这是一个很好的解决方法,我可以使用它。但我想知道是否有任何方法可以直接在查询中使用它。
猜你喜欢
  • 2021-04-16
  • 2022-09-22
  • 1970-01-01
  • 2018-06-26
  • 1970-01-01
  • 2018-08-06
  • 2021-11-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多