简单的@Modifying - @Query问题Spring JPA

时间:2018-06-08 20:12:30

标签: java spring spring-data-jpa

我对Spring框架还有点新意,我只想问一个简单的问题。

我已经加载了以下查询,但出于某些原因我得到了:

  

对方法public abstract void

的查询验证失败

这是在我开始申请之前发生的,如果我发表评论它就可以了。

查询的其余部分工作正常

有问题的查询是:

@Transactional
@Modifying(clearAutomatically = true)
@Query("UPDATE user u SET u.name=:name WHERE u.internalId=:internalId")
public  void markEntryAsRead(@Param("internalId") String internalId, @Param("name") String name);

只需要知道查询是否正确完成

谢谢:)

2 个答案:

答案 0 :(得分:0)

userRepo是:

public interface UserRepo extends CrudRepository<UserModel, String>{

@Transactional
Long internalId(String internalId);


@Transactional
@Modifying(clearAutomatically = true)
@Query("UPDATE user u SET u.internalId=:internalId WHERE u.id=:id")
void markEntryAsRead(@Param("id") String id, @Param("internalId") String internalId);


} 

答案 1 :(得分:0)

为什么您的CrudRepository定义为CrudRepository<UserModel, String>

应该是CrudRepository<UserModel, Long>,因为id实体的UserModel类型为Long

此外,在您提出的查询中:

  

@Transactional @Modifying(clearAutomatically = true) @Query("UPDATE user u SET u.internalId=:internalId WHERE u.id=:id") void markEntryAsRead(@Param("id") String id, @Param("internalId") String internalId);

您将id参数作为String传递,但应该是int,因为在您的实体中,您private int id;internalId相同。

<强>因此

尝试将您的CrudRepository定义为CrudRepository<UserModel, Long>,并在查询中使用UserUserModel,例如:

@Transactional
@Modifying //clearAutomatically is true by default, so there's no need to specify it
@Query("UPDATE UserModel u SET u.internalId=:internalId WHERE u.id=:id")
void markEntryAsRead(@Param("id") int id, @Param("internalId") int internalId);

@Transactional
@Modifying //clearAutomatically is true by default, so there's no need to specify it
@Query("UPDATE UserModel u SET u.name=:name WHERE u.internalId=:internalId")
public void markEntryAsRead(@Param("internalId") int internalId, @Param("name") String name);

另一种解决方案

由于您正在使用CrudRepository,因此您只需致电:

UserModel userModel = userRepo.findOne(id);
userModel.setInternalId(internalId);
userRepo.save(userModel);

或者,如果您没有按id选择:

List<UserModel> userList = userRepo.findByName(internalId);
userList.forEach(user -> user.setName(name));
userRepo.save(userList);