1

このチュートリアルに基づいたSpring MVC 3.1アプリケーションがあります。アプリケーションを注釈ベースのアプリケーションに変更し、正常に動作している jstl で InternalResourceViewResolver を使用するようにビュー ハンドラーを調整しました。

簡単に言うと、アプリは spring mvc、spring data 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)

ユーザーサービス...

    ...   
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;
...

ユーザーリポジトリ

    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 );
}

ユーザーコントローラー

    @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 クエリを変更する必要があることを述べているスレッドをいくつか見てきました...しかし、この問題をデバッグする方法がわかりません...

4

1 に答える 1

3

これは、名前付きパラメーターを名前付きクエリの位置パラメーターに置き換えることで解決されました..

    @NamedQuery( name = User.FIND_BY_USERNAME, 
    query = "select u from user u where u.username = ?1" )
于 2012-12-18T01:29:20.197 に答える