web-dev-qa-db-fra.com

Les annotations ne sont pas autorisées ici

Je crée un UserRepository qui implémente JpaRepository et fonctionne avec l'entité User. J'ai besoin d'une méthode pour mettre à jour le nom d'utilisateur. J'ai décidé de le faire avec l'aide de @Query. Mais c'est marqué par Intellij. Voici mon code pour le référentiel:

@Repository
public interface UserRepository extends JpaRepository<User, Long> {

@Modifying
@Query(value = "update User user set user.name= %?username"))
void updatingUser(@Param(value = "username") String username);
}

Et pour l'entité:

@Entity
@Table(name = "users")
public class User {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "user_id")
private Long id;

@NotNull
@Column(name = "user_name")
private String username;
}

Et j’ai été confronté à un tel problème: "Les annotations ne sont pas autorisées ici", dit Intellij Idea et marque la ligne avec les annotations @Query. Et ça m'a fait confondre

6
Andrey-2310

Désolé les gars. C'était tellement stupide pour moi d'écrire des guillemets à la fin de cette ligne. Mais en réalité je ne comprends pas pourquoi Intellij n'a pas remarqué cela mais a commencé à marquer cette ligne avec une autre erreur

7
Andrey-2310

Eh bien, j'ai eu ce problème avec la requête suivante après la copie de SQLyog.

SELECT  id FROM (SELECT * FROM departments ORDER BY id) dpt_sorted, (SELECT @pv := '2') initialisation WHERE   FIND_IN_SET(parent_dept, @pv) AND LENGTH(@pv := CONCAT(@pv, ',', id));

Mais lorsque j'ai tapé la requête, le message d'erreur a disparu. Peut-être un problème copy et paste dans mon cas. Cela pourrait être utile.

0
Shahzeb

L'utilisation de l'annotation @Query à cet endroit est absolument appropriée. Mais votre requête n'est pas tout à fait correcte.

Les paramètres de requête peuvent être nommés - ': nom' ou indexés - '? 1'.

Vous devez utiliser les requêtes de mise à jour avec la clause 'where', sinon vous mettrez à jour tous les enregistrements.

Votre code devrait être comme ça:

@Modifying
@Query("update User u set u.name = ?1 where u.name = ?2")
void updateByName(String value, String name);

Ou comme ceci:

@Modifying
@Query("update User u set u.name = :value where u.name = :name")
void updateByName(@Param("value") String value, @Param("name") String name);

Faites attention - bien que le champ 'nom' ne soit pas unique, vous mettrez à jour TOUS les utilisateurs avec un 'nom' donné. Pour mettre à jour un seul utilisateur, vous devez utiliser un champ unique ou une clé primaire dans la clause 'where', par exemple:

@Modifying
@Query("update User u set u.name = ?1 where u.id = ?2")
void updateById(String value, Long id);

Soit dit en passant, si vous devez mettre à jour tous les utilisateurs ayant un modèle de nom spécifique, utilisez l'opérateur 'like':

@Modifying
@Query("update User u set u.name = ?1 where u.name like '%'||?2||'%'")
void updateByNameLike(String value, String name);

Informations utiles:

Spring Data JPA - Documentation de référence

Référence du langage JPQL

Tutoriel SQL

P.S. L'annotation @Repository n'est pas nécessaire

0
Cepr0