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?