带有enum参数的Spring @Query注释

per*_*rak 8 java spring spring-data-jpa

是否可以在@Query注释中使用enum参数?

这是我用来查找用户角色的代码:

Role userRole = roleRepository.findByRole(Roles.USER);
if ( userRole == null ) {
    LOGGER.debug("No role found with role: {}", Roles.USER);
}
Run Code Online (Sandbox Code Playgroud)

它打印出来

No role found with role: ROLE_USER
Run Code Online (Sandbox Code Playgroud)

但如果我试图找到所有角色,这就是我得到的:

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]
Run Code Online (Sandbox Code Playgroud)

如您所见,用户角色确实存在.

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

}
Run Code Online (Sandbox Code Playgroud)

角色:

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

}
Run Code Online (Sandbox Code Playgroud)

小智 9

尝试在 Query 中使用 SpEl 并调用 Enum 参数的 toString(),如下所示:

@Query("SELECT r FROM Role r WHERE LOWER(r.role) = LOWER(:#{#role?.toString()})")
    public Role findByRole(@Param("role") Roles role);
Run Code Online (Sandbox Code Playgroud)

或更短:

@Query("SELECT r FROM Role r WHERE LOWER(r.role) = LOWER(:#{#role})")
    public Role findByRole(@Param("role") Roles role);
Run Code Online (Sandbox Code Playgroud)

  • 如果我需要角色列表怎么办? (5认同)

nob*_*beh 3

我建议正确使用JPA 枚举类型。将类型“角色”属性更改为:

@Column(name = "role")
@Enumerated(EnumType.STRING)
private Roles role;
Run Code Online (Sandbox Code Playgroud)

这应该会自动修复查询结果。

  • 尝试过这个但没有成功。启用更具体的日志记录后,我收到此消息:09:20:28.953 [main] TRACE ohtype.descriptor.sql.BasicBinder - 绑定参数 [1] 作为 [VARBINARY] - ROLE_USER。它是否将参数绑定为错误类型? (6认同)
  • 这个问题与查询结果无关。问题是关于提供给查询的参数! (3认同)