Есть ли способ использовать константы внутри 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