Есть ли способ использовать константы внутри Spring Значение аннотации данных @Query?
Я не хочу жестко указывать постоянные значения, я бы скорее указал их через ссылочную переменную.
Например, вместо написания следующего запроса:
@Query(value = "SELECT u FROM UserModel u WHERE u.status = 1")
.. Я хотел бы извлечь hardcoded значение '1' и написать что-то вроде:
@Query(value = "SELECT u FROM UserModel u WHERE u.status = UserModel.STATUS_ACTIVE") //doesn't compile
Есть ли способ указать константы, подобные во втором примере внутри spring -data запросов?
Ответы
Ответ 1
Вам нужно использовать полное имя класса, например:
@Query("SELECT u FROM UserModel u WHERE u.status = com.example.package.UserModel.STATUS_ACTIVE")
Плохая вещь в том, что IDE не признает это как использование класса UserModel. Единственное преимущество заключается в том, что вы можете сохранить значение в одном месте, что является достаточным в большинстве случаев.
Ответ 2
Я бы рекомендовал создать Enum
и поле этого перечисления для объекта.
public enum UserModelStatus{
ACTIVE, INACTIVE
}
public UserModel{
/* Other fields ommitted */
@Enumerated(EnumType.STRING)
private UserModelStatus status;
/* Get/Set Method */
}
Затем создайте свой метод репозитория:
@Repository
public interface UserModelRepository extends JpaRepository<UserModel, Long>{
public List<UserModel> findByStatus(UserModelStatus status);
}
Используя Spring Data, вам даже не нужно писать JPQL, просто вызовите метод, например:
@Autowired
UserModelRepository userModelRepository;
public void someMethod(){
List<UserModel> userModels = userModelRepository.findByStatus(UserModelStatus.ACTIVE);
}
Ответ 3
Используйте следующее:
В интерфейсе репозитория определите константу следующим образом:
public static final String USER_QUERY = "SELECT u FROM UserModel u WHERE u.status = " + UserModel.STATUS_ACTIVE;
Теперь вы можете использовать
@Query(value=USER_QUERY)
Ответ 4
Если вы хотите использовать константы непосредственно в своей аннотации @Query, вы можете написать что-то вроде:
@Query("SELECT u FROM UserModel u WHERE u.status = " + UserModel.STATUS_ACTIVE)
Ответ 5
Ответ на это кажется "Нет" для стандартного решения.
Некоторые реализации JPA могут иметь собственные решения, но спящий режим для одного не кажется и не поддерживает ни один из методов, предложенных другими ответами здесь.
Ответ 6
Мне удалось использовать константу String класса в запросе через оператор SpEL T(), который дает вам доступ к статическим методам и константам в данном классе. Для String мне нужно обернуть выражение одинарными кавычками ('), возможно, это понадобится и вам (если возникает QuerySyntaxException).
Попробуйте что-то вроде этого,
@Query("SELECT u FROM #{#entityName} u " +
"WHERE u.status = #{T(fully.qualified.path.UserModel).STATUS_ACTIVE}")
Примечание: как-то это не работает, если вы используете UserModel вместо # {# entityName}.
В документах, упомянутых ниже, см.: https://docs.spring.io/spring/docs/current/spring-framework-reference/core.html#expressions-beandef-xml-based
Не знаю, когда это поддерживается, у меня есть spring -data-jpa 1.4.3, spring -framework 3.2.17