Есть ли способ использовать значение константы (EnumType Ordinal) в аннотации @Query в репозитории JPA?

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 ответа


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

Спецификация JPA гласит:

4.6.1 Литералы

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

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

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

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

public interface ResourceRepository extends JpaRepository<Test, String> {

    List<Test> findByCountEnum(CountEnum ce);
}

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

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

Если вы присваиваете 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();
}

Есть идеи?

10000