java 带有枚举参数的 Spring @Query 注释
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/17242408/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Spring @Query annotation with enum parameter
提问by perak
Is it possible to use enum parameter with @Query annotation?
是否可以将 enum 参数与 @Query 注释一起使用?
Here is the code I'm using to find user role:
这是我用来查找用户角色的代码:
Role userRole = roleRepository.findByRole(Roles.USER);
if ( userRole == null ) {
LOGGER.debug("No role found with role: {}", Roles.USER);
}
and it prints out
它打印出来
No role found with role: ROLE_USER
but if I try to find all roles this is what I get:
但如果我试图找到所有角色,这就是我得到的:
for ( Role r : roleRepository.findAll() )
LOGGER.debug("{}", r);
Role@8a8c0a[roleId=1,role=role_admin,version=0]
Role@1efe9ee[roleId=2,role=role_staff,version=0]
Role@1e70f68[roleId=3,role=role_user,version=0]
Role@a475d1[roleId=4,role=role_guest,version=0]
As you can see user role does exists.
如您所见,用户角色确实存在。
RoleRepository:
角色库:
public interface RoleRepository extends JpaRepository<Role, Long> {
@Query("SELECT r FROM Role r WHERE LOWER(r.role) = LOWER(:role)")
public Role findByRole(@Param("role") Roles role);
}
Role:
角色:
@Entity
@Table(name = "role")
public class Role {
public enum Roles {
ADMIN("ROLE_ADMIN"),
STAFF("ROLE_STAFF"),
USER("ROLE_USER"),
GUEST("ROLE_GUEST");
private String role;
private Roles(String role) {
this.role = role;
}
public String getRole() {
return role;
}
@Override
public String toString() {
return role;
}
}
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "role_id", updatable = false)
private Long roleId;
@Column(name = "role")
private String role;
@Version
@Column(name = "version")
private long version = 0;
public Long getRoleId() {
return roleId;
}
public String getRole() {
return role;
}
public long getVersion() {
return version;
}
@Override
public String toString() {
return new ReflectionToStringBuilder(this).toString();
}
}
回答by nobeh
I suggest proper use of JPA enumerated types. Change the type "role" property as:
我建议正确使用JPA 枚举类型。将类型“角色”属性更改为:
@Column(name = "role")
@Enumerated(EnumType.STRING)
private Roles role;
This should automatically fix the query result.
这应该会自动修复查询结果。
回答by Алексей Виноградов
Try using SpEl in Query and call toString() of Enum parameter like this:
尝试在 Query 中使用 SpEl 并像这样调用 Enum 参数的 toString() :
@Query("SELECT r FROM Role r WHERE LOWER(r.role) = LOWER(:#{#role?.toString()})")
public Role findByRole(@Param("role") Roles role);
or shorter:
或更短:
@Query("SELECT r FROM Role r WHERE LOWER(r.role) = LOWER(:#{#role})")
public Role findByRole(@Param("role") Roles role);