使用ManyToMany修改查询

时间:2020-05-21 16:51:38

标签: mysql spring-data-jpa

我在Spring中有更新查询问题。我无法为用户添加新权限。这是我的解决方案:

UserRepository:

public interface UserRepository extends JpaRepository<User, Long> {

Optional<User> findByUsername(String username);
Optional<User> findByIdAndAuthorities(Long id, Authorities auth);

@Modifying
@Transactional
@Query("UPDATE User u SET u.authorities = :authorities WHERE u.id=:id")
void setUserAuthorities(@Param("id") Long id, @Param("authorities") List<Authorities> authorities);}

控制器:

@Controller
public class AdminController {

private UserRepository userRepository;
private AuthoritiesRepository authoritiesRepository;

@Autowired
public AdminController(UserRepository userRepository, AuthoritiesRepository authoritiesRepository){
    this.userRepository = userRepository;
    this.authoritiesRepository = authoritiesRepository;
}


@PostMapping("/addAdmin")
public String addAdmin(User user, Model model){
    Optional<User> userDB = userRepository.findByUsername(user.getUsername());

    if(!userDB.isPresent()){
        model.addAttribute("userError","User doesn't exist");
    }
    else{
        List<Authorities> adminAdd  = new ArrayList<>();
        adminAdd.addAll(adminAdd);
        userRepository.setUserAuthorities(userDB.get().getId(), adminAdd);
    }

    return "createAdmin";
}}

我发送表格时出现错误:

2020-05-21 18:46:20.291 ERROR 8564 --- [nio-8080-exec-8] o.h.engine.jdbc.spi.SqlExceptionHelper   : You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'set .=null where id=1' at line 1
2020-05-21 18:46:20.308 ERROR 8564 --- [nio-8080-exec-8] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.dao.InvalidDataAccessResourceUsageException: could not execute statement; SQL [n/a]; nested exception is org.hibernate.exception.SQLGrammarException: could not execute statement] with root cause

用户通过Auth by @ ManyToMany连接。有人有主意吗?

1 个答案:

答案 0 :(得分:-1)

JPQL更新仅允许更新

请参见JPA规范的第4.10节:

update_statement ::= update_clause [where_clause]
update_clause ::= UPDATE entity_name [[AS] identification_variable]
                     SET update_item {, update_item}*
update_item ::= [identification_variable.]{single_valued_embeddable_object_field.}*
                     {state_field | single_valued_object_field} = new_value

我看到两个主要选择:

  1. 只需加载User实体,设置Authorities,然后让JPA将更改刷新到数据库。
  2. 如果您不想或无法加载实体,则可以使用SQL直接操作数据库中的数据。
相关问题