2017-08-05 186 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

但这个对象正是我所需要的。它代表我的实体。 –