Есть ли способ использовать значение константы (EnumType Ordinal) в аннотации @Query в репозитории JPA? - PullRequest
0 голосов
/ 14 мая 2019

Enum,

public enum CountEnum {
   ONE,
   TWO
}

Класс сущности,

@Entity
public class Test {
...
    @Enumerated(EnumType.ORDINAL)
    private CountEnum countEnum;
...
}

Я хочу запросить все строки Test, имеющие countEnum 'ONE'. Но так как здесь @Enumerated(EnumType.ORDINAL) является порядковым, я должен поставить значение int 'ONE' в @Query вместо String.

Интерфейс моего репозитория,

public interface ResourceRepository extends JpaRepository<Test, String> {
    @Query(" select test from Test test where test.countEnum = " + CountEnum.ONE.ordinal())
    List<Test> find();
}

Но выдает ошибку, говорящую Attribute value must be constant. Итак, как мне запросить все эти строки, используя порядковый номер enum, так как я не хочу помещать жестко закодированные постоянные значения?

Ответы [ 4 ]

2 голосов
/ 15 мая 2019

Как вы думаете, почему вы должны использовать порядковый номер при написании JPQL?

В спецификации JPA указано:

4.6.1 Литералы

[...] Литералы enum поддерживают использование синтаксиса литералов enum Java. Необходимо указать полное имя класса перечисления.

Поэтому я ожидаю, что сработает что-то вроде следующего:

public interface ResourceRepository extends JpaRepository<Test, String> {
    @Query(" select test from Test test where test.countEnum = com.somepackage.with.sub.pakcages.CountEnum.ONE")
    List<Test> find();
}
1 голос
/ 14 мая 2019

Определите запрос как строковую константу:

private static final String QUERY_FIND = " select test from Test test where test.countEnum = " + CountEnum.ONE.ordinal();

Затем используйте константу в аннотации:

public interface ResourceRepository extends JpaRepository<Test, String> {
    @Query(QUERY_FIND)
    List<Test> find();
}
1 голос
/ 14 мая 2019

Если вы присваиваете enum постоянные значения:

public enum CountEnum {
    ONE(Constants.ONE_VALUE), TWO(Constants.TWO_VALUE);

    CountEnum(int countEnum) {
    }

    public static class Constants  {
        public static final int ONE_VALUE = 0;
        public static final int TWO_VALUE = 1;
    }
}

Тогда вы можете использовать enum в @Query аннотации:

public interface ResourceRepository extends JpaRepository<Test, String> {
    @Query(" select test from Test test where test.countEnum = " + CountEnum.Constants.ONE_VALUE)
    List<Test> find();
}
1 голос
/ 14 мая 2019

Используйте обычные методы, такие как:

public interface ResourceRepository extends JpaRepository<Test, String> {

    List<Test> findByCountEnum(CountEnum ce);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...