2012-12-17 31 views
1

我有一个基于this tutorial的spring mvc 3.1应用程序。我已经将应用程序修改为基于注释的应用程序,并且调整了视图处理程序以通过jstl使用InternalResourceViewResolver,该工作正常。Hibernate QueryParameterException Spring MVC&JSON

在应用程序使用弹簧MVC中,弹簧数据JPA和的jqGrid以产生具有基本的CRUD映射动作传递到控制器通过响应一个简单的用户列表简而言之...

当我尝试修改通过更新动作我得到500错误(AOP跟踪拦截器)记录......

异常 ...

Servlet.service() for servlet [dispatcher] in context with path  
    [/spring-jqgrid-tutorial] threw exception [Request processing failed;  
    nested exception is org.springframework.dao.InvalidDataAccessApiUsageException: 
    org.hibernate.QueryParameterException: 
    Position beyond number of declared ordinal parameters.  
    Remember that ordinal parameters are 1-based! 
    ... 
    at org.beckett.service.UserService.update(UserService.java:32) 

UserService ...

... 
public Boolean update(User user) { 
    User existingUser = repository.findByUsername(user.getUsername()); 
    if(existingUser == null) { 
     return false; 
    } 
    // Only firstName, lastName, and role fields are updatable 
    existingUser.setFirstName(user.getFirstName()); 
    existingUser.setLastName(user.getLastName()); 
    existingUser.getRole().setRole(user.getRole().getRole()); 

    User saved = repository.save(existingUser); 
    if(saved == null) 
     return false; { 

    } 
    return true; 
} 

    ... 

用户实体

@Entity(name = "user") 
    @NamedQuery(name = User.FIND_BY_USERNAME, 
    query = "select u from user u where u.username = :username") 
    public class User { 

    public static final String FIND_BY_USERNAME = "User.findByUsername"; 

    @Id @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 

    private String firstName; 
    private String lastName; 

    @Column(unique = true) 
    private String username; 

    @JsonIgnore 
    private String password; 

    @OneToOne(cascade = CascadeType.ALL, mappedBy = "user") 
    private Role role; 
... 

UserRepository

public interface UserRepository extends JpaRepository<User, Long> { 

    User findByUsername(String username); 

    Page<User> findByUsernameLike(String username, Pageable pageable); 

    Page<User> findByFirstNameLike(String firstName, Pageable pageable); 

    Page<User> findByLastNameLike(String lastName, Pageable pageable); 

    Page<User> findByFirstNameLikeAndLastNameLike(String firstName, String lastName, Pageable pageable); 

    @Query("select u from user u where u.role.role = :role") 
    Page<User> findByRole(@Param("role") Integer role, Pageable pageable); 
} 

UserController的

@RequestMapping(value = "/update", 
    produces = "application/json", 
    method = RequestMethod.POST) 

    public @ResponseBody StatusResponse update( 
      @RequestParam String username, 
      @RequestParam String firstName, 
      @RequestParam String lastName, 
      @RequestParam Integer role) { 

     User existingUser = new User(username, firstName, lastName, new Role(role)); 
     Boolean result = service.update(existingUser); 
     return new StatusResponse(result); 
} 

我已经看到了关于这个陈述的例外的要求来改变HQL查询多个线程。不过,我不知道如何去调试这个问题...

+0

是否有您的命名查询的原因?存储库应为您创建查询。 – micha

+0

我也有一个jparepo实现...我将它添加到示例中... –

回答

3

这是通过更换得到解决positional parameter命名查询命名参数..

@NamedQuery(name = User.FIND_BY_USERNAME, 
    query = "select u from user u where u.username = ?1")