注释不允许在此处。

33

我正在创建一个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):

@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注释的行。这让我感到困惑。


1
如果我的回答有帮助到您,请不要忘记接受/点赞它。 - Cepr0
7个回答

124
在我的情况下,我意外地在@Query的末尾键入了";"。这可能会帮助其他人。

4
我犯了相同的错误,删除了“;”后代码成功编译。 - Rajan Chauhan
1
对我来说,问题在于忘记在我的方法签名中添加()。 - jkerak
1
感谢您的解答。我犯了同样的错误,只是出于习惯在行末加上了分号。 - Lucy
1
很高兴来到这里,因为那个问题会让我困惑一段时间。喜欢来Stack Overflow发现自己只是普通的蠢而不是复杂的蠢。 - Literate Corvette
原来我也是这样做的,尽管我盯着它看了相当长时间。谢谢你发帖,如果没有你的评论,我可能要花更长的时间才能发现。 - Johnboy

14

很抱歉,大家。在这行代码的末尾写双引号真是太愚蠢了。但我实际上不明白为什么Intellij没有注意到这一点,却开始用另一个错误标记这一行。


3
在我的情况下,我在@Query语句的末尾意外地输入了一个“;”。
@Query("SELECT a FROM Author a")
@QueryHints(value = @QueryHint(name = HINT_FETCH_SIZE, value= "" + Integer.MIN_VALUE));
Stream<Author> streamAll();

从 @QueryHints 中删除 ';' 后,它就完美地工作了。
@Query("SELECT a FROM Author a")
@QueryHints(value = @QueryHint(name = HINT_FETCH_SIZE, value= "" + Integer.MIN_VALUE))
Stream<Author> streamAll();

2
抱歉,这已经晚了4年,但是您在 @Query 行末有一个多余的 ')'。

0
在我的情况下,我试图在构造函数中使用它...

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));

但是当我输入查询时,错误信息消失了。可能是我的复制粘贴出了问题。这可能会有所帮助。


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);

请注意 - 虽然“名称”字段不是唯一的,但您将更新具有给定“名称”的所有用户。要仅更新一个用户,您必须在“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 - 参考文档

JPQL 语言参考

SQL 教程

附注:注解@Repository不是必需的。


谢谢,我已经纠正了。现在我的查询看起来像这样。 修改 查询(value =“update com.ranv.Model.ModelDB.User u set u.username =?1 where u.id =?2”) void updatingUser(String username,Long id); 但现在有另一个问题:User类不是实体。但实际上它是的(实体注释在它的位置,正如您在我的代码中所看到的)。 - Andrey-2310
@Andrey-2310 检查导入。我认为你设置了错误的导入。(不要忘记在这里“感谢”等于“接受/赞同答案”。) - Cepr0
但是这个对象正是我所需要的。它代表了我的实体。 - Andrey-2310
好的。我回答了你的第一个问题吗? - Cepr0
@ Cepr0,好的,顺便说一下,我的第二个问题的答案是添加Hibernate和JPA模块。 - Andrey-2310

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接