JpaRepositoryを実装し、Userエンティティで動作するUserRepositoryを作成しています。ユーザー名を更新する方法が必要です。 @Queryの助けを借りてそれを行うことにしました。しかし、それはIntellijによってマークされています。リポジトリ用の私のコードは次のとおりです。
@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);
}
エンティティの場合:
@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;
}
そして、私はそのような問題に直面しました:「注釈はここでは許可されていません」とIntellij Ideaは言い、行に@Query注釈を付けます。そして、それは私を混乱させました
ごめんなさいこの行の最後に二重引用符を書くのはとても愚かでした。しかし、私は実際にIntellijがそれに気付かなかった理由を理解していませんが、別の間違いでこの行をマークし始めました
私の場合、誤って「;」と入力しました。 @Queryの最後。他の誰かを助けるかもしれません。
さて、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));
しかし、クエリを入力すると、エラーメッセージが消えました。私の場合、copy
とpaste
の問題かもしれません。これは役に立つかもしれません。
@Query
この場所の注釈は絶対に適切です。しかし、クエリはまったく正しくありません。
クエリパラメータには、名前を付けることができます-':name'またはインデックス付き-'?1'。
'where'句を含む更新クエリを使用する必要があります。そうしないと、すべてのレコードが更新されます。
コードは次のようになります。
@Modifying
@Query("update User u set u.name = ?1 where u.name = ?2")
void updateByName(String value, String name);
またはこのように:
@Modifying
@Query("update User u set u.name = :value where u.name = :name")
void updateByName(@Param("value") String value, @Param("name") String name);
注意してください-「名前」フィールドは一意ではありませんが、指定された「名前」を持つすべてのユーザーを更新します。 1人のユーザーのみを更新するには、「where」句で一意のフィールドまたは主キーを使用する必要があります。次に例を示します。
@Modifying
@Query("update User u set u.name = ?1 where u.id = ?2")
void updateById(String value, Long id);
ところで、特定の名前パターンを持つすべてのユーザーを更新する必要がある場合は、「like」演算子を使用します。
@Modifying
@Query("update User u set u.name = ?1 where u.name like '%'||?2||'%'")
void updateByNameLike(String value, String name);
役立つ情報:
追伸注釈@Repository
は不要です