2013-06-21 1 views
4

Можно ли использовать параметр enum с помощью аннотации @Query?Аннотации Spring @Query с параметром enum

Вот код, я использую, чтобы найти роль пользователя:

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

[email protected][roleId=1,role=role_admin,version=0] 
[email protected][roleId=2,role=role_staff,version=0] 
[email protected][roleId=3,role=role_user,version=0] 
[email protected][roleId=4,role=role_guest,version=0] 

Как вы видите, роль пользователя существует.

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

} 

Роль:

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

} 

ответ

1

Я предлагаю правильное использование JPA enumerated types. Измените свойство типа «роль» следующим образом:

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

Это должно автоматически исправить результат запроса.

+2

Пробовал это без каких-либо успехов. После включения более конкретного ведения журнала я получил это сообщение: 09: 20: 28.953 [main] TRACE o.h.type.descriptor.sql.BasicBinder - параметр привязки [1] как [VARBINARY] - ROLE_USER. Связает ли этот параметр с неправильным типом? – perak

+0

Возможно, попробуйте использовать параметр «String» в методе репозитория, а не Enum напрямую. Если вы используете собственный SQL в запросе, попробуйте использовать «like» – frandevel