2017-08-05 111 views
0

我正在創建一個UserRepository,它實現了JpaRepository並與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

不要忘了接受/ upvote答案,如果它幫助你.. – Cepr0

回答

1

對不起,夥計們。在這行結尾寫下雙引號是非常愚蠢的。但我實際上不明白爲什麼Intellij沒有注意到,但開始以另一個錯誤標記這條線

0

在這個地方使用@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); 

講究 - 而給定的「名稱」字段是不是唯一的,你將更新所有用戶的名字」。要更新只有一個用戶必須使用的唯一字段或者主鍵「其中」條款中,例如:

@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

JPQL Language Reference

SQL Tutorial

P.S.註釋@Repository沒有必要

+0

謝謝,我已經糾正它。現在我的查詢看起來像這樣。 修改 查詢(value =「update com.ranv.Model.ModelDB.User u set u.username =?1 where u.id =?2」) void updatingUser(String username,Long id);但現在還有另一個問題:類用戶不是實體。但實際上它是(實體註釋位於上面的代碼中) –

+0

@ Andrey-2310檢查導入。我認爲你設置了一個錯誤的。 (並且不要忘記,'謝謝'在這裏等於'接受/贊成答案'..) – Cepr0

+0

但這個對象正是我所需要的。它代表我的實體。 –

相關問題