【问题标题】:Simple @Modifying - @Query issue Spring JPA简单的@Modifying - @Query 问题 Spring JPA
【发布时间】:2018-06-08 20:12:29
【问题描述】:

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

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

谢谢:)

【问题讨论】:

  • 你能发布其余的错误信息吗?确定是UPDATE user u 而不是UPDATE User u
  • 添加了错误日志:)
  • @sonic18 那么它与Update User u 一起工作吗?正如您在日志中看到的那样,有user is not mapped [UPDATE user c SET c.service_type=:service_type WHERE c.msisdn=:msisdn]。看起来您在另一个 query 中遇到了同样的错误。你能提供整个UserRepo 课程吗?
  • 我用 Update User u 试过了,结果还是一样。我还上传了 UserRepo。再次感谢:)

标签: java spring spring-data-jpa


【解决方案1】:

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


} 

【讨论】:

  • 这不应该是答案。请用这个编辑您的问题并将其删除。
【解决方案2】:

为什么你的CrudRepository 被定义为CrudRepository&lt;UserModel, String&gt;

应该是CrudRepository&lt;UserModel, Long&gt;,因为您的UserModel 实体的idLong 类型。

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

@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&lt;UserModel, Long&gt;,并且在您的查询中不要使用User,而是使用UserModel,例如:

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

【讨论】:

    猜你喜欢
    • 2018-12-25
    • 1970-01-01
    • 1970-01-01
    • 2017-10-07
    • 2021-11-06
    • 1970-01-01
    • 2021-04-16
    • 2021-12-24
    • 1970-01-01
    相关资源
    最近更新 更多