【问题标题】:Spring @Query annotation with enum parameter带有枚举参数的 Spring @Query 注释
【发布时间】:2013-06-19 00:11:29
【问题描述】:

@Query 注解可以使用枚举参数吗?

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

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

然后打印出来

No role found with role: ROLE_USER

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

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]

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

角色存储库:

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

}

角色:

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

}

【问题讨论】:

标签: java spring spring-data-jpa


【解决方案1】:

尝试在 Query 中使用 SpEl 并像这样调用 Enum 参数的 toString():

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

或更短:

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

【讨论】:

  • 如果我需要角色列表怎么办?
【解决方案2】:

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

@Column(name = "role")
@Enumerated(EnumType.STRING)
private Roles role;

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

【讨论】:

  • 试过这个没有任何成功。启用更具体的日志记录后,我收到以下消息:09:20:28.953 [main] TRACE o.h.type.descriptor.sql.BasicBinder - 绑定参数 [1] 作为 [VARBINARY] - ROLE_USER。是否将参数绑定为错误类型?
  • 也许尝试在存储库方法中使用“字符串”参数,而不是直接使用 Enum。如果在查询中使用原生 SQL,请尝试使用“like”
  • 这个问题与查询结果无关。问题是关于提供给查询的参数!
猜你喜欢
  • 2018-09-14
  • 2018-01-19
  • 1970-01-01
  • 2020-10-29
  • 1970-01-01
  • 1970-01-01
  • 2020-04-04
  • 1970-01-01
  • 2018-07-24
相关资源
最近更新 更多