JpaRepository не считывает строковый параметр в собственном запросе

#java #sql #spring-data-jpa

#java #sql #spring-data-jpa

Вопрос:

Я столкнулся с проблемой с моим JpaRepository в приложении spring boot Я хочу выполнить простой запрос на обновление моей базы данных, но оказывается, что собственный запрос довольно раздражает, пожалуйста, помогите

 public interface ImageRepository extends JpaRepository<Image, Integer> {
    @Modifying 
    @Transactional
    @Query(value = "UPDATE image SET path =(0?), status = (1?) WHERE Id = (2?)", nativeQuery = true)
    void update(String path ,String status,int Id);

}
  

приведенный выше код возвращает следующее сообщение об ошибке

 com.microsoft.sqlserver.jdbc.SQLServerException: Incorrect syntax near '@P0'.
  

Я попытался изменить диалект SQL на
org.hibernate.dialect.SQLServer2008Dialect
org.hibernate.dialect.SQLServer2012Dialect
соответственно, и ни один из них не сработал.

Я также попытался написать запрос другим способом, который не выдает мне ошибку, но не обновляет поля. он может определить целочисленное значение из метода, но он установит для строковых значений значение emply:

     @Query(value = "UPDATE image SET physical_path =(0), status = (1) WHERE Id = (2)", nativeQuery = true)
  

Если кто-нибудь сталкивался с такой же проблемой, пожалуйста, поддержите

Ответ №1:

Сформулируйте запрос следующим образом :

 @Query(value = "UPDATE image i SET path =:path, status = :status WHERE i.Id = :Id", nativeQuery = true)
void update(@Param("path") String path , @Param("status") String status, @Param("Id") int Id);
  

Для позиционных параметров :

 @Query(value = "UPDATE image i SET path = ?1, status = ?2 WHERE i.Id = ?3", nativeQuery = true)
void update(String path , String status, int Id);
  

Комментарии:

1. спасибо, первый метод сработал для меня. Я попробовал второй, который вы предложили, но у меня это не сработало. в любом случае, спасибо, теперь я могу переместить его с остальной частью кода. Я был действительно раздражен этим методом более двух часов

2. Нет проблем. Рад узнать, что вы могли бы продолжить свою работу.

Ответ №2:

Из JPA-ссылки Spring Data вы можете видеть, что параметры (в том виде, в котором вы хотите их использовать) определяются как -> ?1, ?2 etc..

Кроме того, пожалуйста, имейте в виду, что синтаксис JPQL немного отличается от обычного sql.

 @Modifying
@Query("update Image i set i.path = ?1 where i.status = ?2 where i.id = ?3")
void update(String path, String status, int id);
  

Комментарии:

1. спасибо за информацию, но я пробовал этот запрос, и он не справился с задачей. однако решение указано @Som. еще раз спасибо за ответ

2. Эй, @Fadi, не стесняйтесь, дайте мне знать, в чем проблема с этим ответом

3. Я получаю неправильный синтаксис рядом с ошибкой «@ P0». Что указывает на то, что параметры не могут быть доступны из запроса. Странно то, что у меня был тот же код два месяца назад, и он работал так, как ожидалось. Но после новой установки SQL server 2019 у меня по некоторым причинам начали возникать проблемы с репозиторием JPA.