我在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连接。有人有主意吗?
答案 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
我看到两个主要选择:
User
实体,设置Authorities
,然后让JPA将更改刷新到数据库。