Как можно передать значение Enum в чистом JPA @Query? - PullRequest
0 голосов
/ 08 октября 2018

Допустим, я хочу установить значение столбца записи как «RESOLVED».Тем не менее, я хочу получить это значение из Enum.Таким образом, запрос остается неизменным независимо от того, решит ли кто-либо «RESOLVED» изменить значение на «RESOLVE» или что-то в этом роде.Другими словами, разработчику не нужно редактировать запрос JPA с новым значением Enum.Просто хотел узнать, как можно это сделать, или JPA не позволяет этого.Я знаю, что запросы являются статическими, но раньше я мог передавать объект внутри запроса для хранения в нем полей результатов запроса.Поэтому я подумал, можно ли сделать то же самое с Enums.

Это моя текущая стратегия: передать «RESOLVE» как статус «@Param».Тем не менее, я все еще хотел бы знать, как передать Enums, так как это скорее обходной путь, чем ответ на сам вопрос.

public interface UpdateStatusStandardDAO extends JpaRepository<DBTableName, Long>
{

    @Transactional
    @Modifying(clearAutomatically = true)
    @Query("UPDATE"
            + " TableName tn"
            + " SET"
            + " tn.status =:status"
            + " WHERE"
            + " tn.field1 =:field1"
            + " AND tn.field2 =:field2"
            + " AND tn.field3 =:field3")
    int updateStatus(@Param("status") String status, @Param("field1") Long field1,
                     @Param("field2") String field2, @Param("field3") String field3);

}

Что я знаю: 1. @Transactional: для обновления / удаленияОПС.В противном случае я получил org.springframework.dao.InvalidDataAccessApiUsageException.2. @Modifying (clearAutomatics = true): поскольку менеджер сущностей не сбрасывает изменения автоматически по умолчанию.

Для простоты мы рассматриваем field1 как первичный ключ.Это тип Long (выводится также из сигнатуры интерфейса).

Для справки: если ни одно из полей в предложении where не является ключом, то рабочая среда SQL может отклонить ваш запрос, если заданы параметры SQL_SAFE_UPDATES.Это связано с тем, что вы не можете обновить или удалить записи, не указав ключ (например, первичный ключ) в предложении where.

1 Ответ

0 голосов
/ 08 октября 2018

Это невозможно, поскольку значение атрибута аннотации должно быть постоянным, а Enum - не постоянным.Но вы можете использовать метод интерфейса java8 по умолчанию для решения этой проблемы.Код шаблона:

public interface TheEntityJpaRepository extends JpaRepository<TheEntity, Long> {
  @Modifying(clearAutomatically = true)
  @Query("UPDATE TheEntity SET status = :status WHERE id = :value")
  int markToStatus(@Param("value") Long value, @Param("status") TheStatusEnum status);

  default int markAsResolved(Long value) {
    return markToStatus(value, TheStatusEnum.RESOLVED);
  }
}

@Entity
public class YourEntity {
  ...
  @Enumerated(EnumType.STRING)
  private Status status;
  ...
}

public enum TheStatusEnum {
  RESOLVED,
  ...
}

Но вы должны знать, что этот способ разоблачит метод markToStatus.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...