Перечисление с методом, используемым в запросе, не преобразуется - PullRequest
0 голосов
/ 07 апреля 2020

Я использую пружинную загрузку с пружинными данными jpa

У меня есть поле с целочисленным типом данных. У меня есть enum с другим значением для этого поля

public class Operation{
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "operation_Sequence")
    @SequenceGenerator(name = "operation_Sequence", sequenceName = "operation_Sequence", allocationSize = 1)
    private Long id;

    private Integer eventProcessStatus;
}

public enum EventProcessStatus {
    CLOSE(2),
    OPEN(99);

    private final int id;

    EventProcessStatus(int id) {
        this.id = id;
    }

    public int getId() {
        return id;
    }
}

В моем хранилище я ищу использовать это перечисление с методом getId

@Query(value = "select ce from Operation ce where "
            + "(ce.eventProcessStatus=com.ns.perma.domain.constants.EventProcessStatus.CLOSE.getId() )")
public List<Operation> findAllOperation();

Когда этот запрос выполняется, я получаю ЗАКРЫТЬ: НЕДЕЙСТВИТЕЛЬНЫЙ ИДЕНТИФИКАТОР.

В журнале sql я вижу

...

where
operation0_.event_process_status=com.ns.perma.billing.domain.constants.EventProcessStatus.SUCCESS.getId() 

Таким образом, команда не преобразована.

Есть идеи?

Ответы [ 2 ]

2 голосов
/ 07 апреля 2020

Вы не можете использовать произвольные Java фрагменты в запросе JPQL.

Но вы можете использовать выражения SpEL в аннотации запроса . Просто учтите, что вам нужно использовать специальный оператор T для доступа к stati c members . Поэтому должно работать следующее (или что-то подобное):

@Query(value = "select ce from Operation ce where "
            + "ce.eventProcessStatus
= :#{ T(com.ns.perma.domain.constants.EventProcessStatus).CLOSE.id ")
public List<Operation> findAllOperation();
1 голос
/ 07 апреля 2020

@ Дженс Шаудер прав. Вы также можете попробовать этот способ.

Вы можете использовать значение перечисления в качестве параметра и передать запрос

@Query(value = "select ce from Operation ce where ce.eventProcessStatus= ?1")
public List<Operation> findAllOperation(int enumValue);

Затем вызвать эту функцию, используя значение перечисления

operationRepo.findAllOperation(EventProcessStatus.CLOSE.getId());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...