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
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
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.
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
P.S. L'annotation @Repository
n'est pas nécessaire