在查询、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 作为参数
我在我的 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 作为参数