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