简体   繁体   English

使用 Spring Data JPA 的派生查询

[英]Derived Queries with Spring Data JPA

My task is to compose a query without using the @Query annotation.我的任务是在不使用@Query注释的情况下编写查询。 If you use select , it will work, but if you use update , then the exception pointing to the line query.executeUpdate();如果你使用select ,它会工作,但如果你使用update ,那么异常指向行 query.executeUpdate();

javax.persistence.TransactionRequiredException: Executing an update/delete query

CustomUserRepository:自定义用户存储库:

@Repository
public interface CustomUserRepository {
    List<User> findByUniqueId(String uniqueId,UserStatus role);
}

CustomUserRepositoryImpl: CustomUserRepositoryImpl:

@Autowired
private EntityManager entityManager;

@Override
public List<User> findByUniqueId(String uniqueId, UserStatus role) {
        Query query = entityManager.createQuery("update User u set u.userStatus=:userStatus where u.unique=:unique");
        query.setParameter("userStatus", role).setParameter("unique", uniqueId);
        query.executeUpdate();
        return query.getResultList();
}

ControllerFour:控制器四:

@Autowired
private UserRepository userRepository;

@PostMapping
public String replaceStatusPost (@RequestParam("uniqueid") String uniqueid, @RequestParam("userstatus") UserStatus userstatus, Model model) {
        List <User> user = userRepository.findByUniqueId(uniqueid, userstatus);
        model.addAttribute("attz", user);
        return "replaceStatus";
}

I think that message says all:我认为该消息说明了一切:

javax.persistence.TransactionRequiredException: Executing an update/delete query javax.persistence.TransactionRequiredException:执行更新/删除查询

When using EntityManager to execute any update operation (update/insert/delete) you have to do that within transaction.当使用EntityManager执行任何更新操作(更新/插入/删除)时,您必须在事务中执行此操作。

Therefore your code should look like:因此,您的代码应如下所示:

entityManager.getTransaction().begin();
// execute any operation on entityManager
entityManager.getTransaction().commit();

Side note, it is generally recommended to use @PersistenceContext instead of @Autowired as that gives more control over the injected EntityManager (especially if you have multiple DB configurations).旁注,通常建议使用@PersistenceContext而不是@Autowired ,因为这样可以更好地控制注入的EntityManager (特别是如果您有多个数据库配置)。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM