我正在创建一个实现JpaRepository的UserRepository,并与User实体一起使用。我需要一种方法来更新用户名。我决定在@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注释标记了这一行。这让我很困惑
答案 0 :(得分:9)
对不起,伙计们。对于我来说,在这一行的末尾写双引号真是太愚蠢了。但我实际上不明白为什么Intellij没有注意到这一点,但开始用另一个错误标记这一行
答案 1 :(得分:1)
就我而言,我不小心输入了“;”在@Query的末尾。可能会帮助别人。
答案 2 :(得分:0)
在这个地方使用@Query
注释是绝对合适的。但是你的查询不太正确。
查询参数可以命名为 - ':name'或indexed - '?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);
注意 - 当'name'字段不唯一时,您将使用给定的'name'更新所有用户。要仅更新一个用户,必须在'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);
有用信息:
Spring Data JPA - Reference Documentation
P.S。注释@Repository
不是必需的
答案 3 :(得分:0)
好吧,从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
问题。这可能会有所帮助。
答案 4 :(得分:0)
抱歉,这已经晚了 4 年,但您在 @Query 行的末尾多了一个 ')'