2012-12-17 36 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")