我创建它实现JpaRepository与用户实体工作的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的末尾。可以帮助别人。
在这个地方使用@Query
注解是绝对合适。但是,你的询问是不太正确的。
查询参数可以被命名为 - “:名称”或索引 - “1?”。
您应该使用更新查询用“其中”条款,否则您将更新所有记录。
你的代码应该是这样的:
@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);
注意 - 而“名称”字段是不是唯一的,你将更新给予“名称”的所有用户。要更新只有一个用户必须使用的唯一字段或者主键“其中”条款中,例如:
@Modifying
@Query("update User u set u.name = ?1 where u.id = ?2")
void updateById(String value, Long id);
顺便说一句,如果你需要更新具有特定名称模式的所有用户 - 使用“喜欢”操作:
@Modifying
@Query("update User u set u.name = ?1 where u.name like '%'||?2||'%'")
void updateByNameLike(String value, String name);
有用的信息:
Spring Data JPA - Reference Documentation
附:注释@Repository
是没有必要的
嗯,我从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
问题。这可能是有益的。