Как использовать параметр enum в JpaRepository? - PullRequest
1 голос
/ 03 апреля 2020

Entity:

@Entity
@Data
@Table(name = "location")
@NoArgsConstructor
public class Location {

    @Id
    @Column(name = "")
    private String id;

    @Column(name = "status", nullable = false)
    @Enumerated(EnumType.STRING)
    private Status status;
}

Enum:

public enum Status {

    ACTIVE, INACTIVE

}

JpaRepository

@Repository
public interface LocationReposity extends CrudRepository<Product, UUID> {

    @Query("select l from Location l where l.deleted is null and (:status is null or LOWER(l.status)=LOWER(:#{#status?.toString()}))")
    public List<Location> findLocations(@Param("status") String status);
}

Ожидается:

Мы хотим запросить местоположения. Когда статус равен нулю, он возвращает все. Когда статус активен, он возвращает только местоположения со статусом «ACTIVE».

Actual:

Когда мы присваиваем статус «ACTIVE», он возвращает только местоположения со статусом «Active». Но когда мы присваиваем значение null, он выдает ошибки:

org.postgresql.util.PSQLException: ERROR: function lower(bytea) does not exist
  Hint: No function matches the given name and argument types. You might need to add explicit type casts.

Вопросы:

С условием (: статус равен нулю), в то время как он все равно сравнивает статус (LOWER (l.status) = LOWER (# {# состояние .ToString ()}?))? Можем ли мы знать, что перечисление равно нулю? Как судить? И hibernate преобразует ноль в bytea?

Решения:

После того, как мы изменим @query, как показано ниже, он работает:

@Query("select l from Location l where l.deleted is null and (:status is null or cast(l.status as text)=:status)")
    public List<Location> findLocations(@Param("status") String status);

Есть ли другие способы передачи перечисление params в Query?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...