2015-09-07 2 views
1

Я пытаюсь вызвать хранимую процедуру сервера MS SQL. Я использую пружинную загрузку, JPA 2.1, спящий режим.Вызов хранимой процедуры SQL-сервера с аннотациями JPA 2.1

В базе данных есть таблица с isbn, названием, автором, описанием и хранимой процедурой, которую я пытаюсь вызвать, принимает один из параметров (isbn) в качестве строки и возвращает только заголовок.

Я получаю следующее сообщение об ошибке:

org.hibernate.procedure.ParameterStrategyException: 
Attempt to access positional parameter [2] but ProcedureCall using named parameters 

Каждый получил решение для этого или узнать, что означает ошибка? Я также пробовал другие комбинации аннотаций.

Book.java

@Entity 
@NamedStoredProcedureQuery(
     name = "bookList", 
     resultClasses=Book.class, 
     procedureName = "dbo.list_books", 
     parameters = { 
      @StoredProcedureParameter(mode = ParameterMode.IN, name = "isbn", type = String.class) 
      }) 
public class Book { 

    @Id 
    private String title; 

    public String getTitle() { 
     return title; 
    } 
    public void setTitle(String title) { 
     this.title = title; 
    }  
} 

BookRepository.java

@Repository 
public interface BookRepository extends CrudRepository<Book, Long> { 

    @Procedure 
    Iterable<Book> list_books(String arg); 
} 

BookService.java

@RestController 
@RequestMapping(value = "/books", produces = MediaType.APPLICATION_JSON_VALUE) 
public class BookService { 

    @Autowired 
    protected BookRepository bookRepository; 

    @RequestMapping 
    public Iterable<Book> books(){ 
     return bookRepository.getBooks("1111111"); 
    } 

ответ

0

Я не решить проблему с аннотациями, я работал вокруг него с EntityManager и StoredProcedureQuery.

Book.java такой же, но без @NamedStoredProcedureQuery. Я удалил хранилище и переписал услугу, как это:

@RestController 
@RequestMapping("/api") 
public class BookService { 

    @RequestMapping(value = "/books", 
      params = {"isbn"}, 
      method = RequestMethod.GET, 
      produces = MediaType.APPLICATION_JSON_VALUE) 
    public List<Book> getByIsbn(@RequestParam(value = "isbn") String isbn){ 
     StoredProcedureQuery sp = em.createStoredProcedureQuery("name.of.stored.procedure", Book.class);    
     sp.registerStoredProcedureParameter("isbn", String.class, ParameterMode.IN); 
     sp.setParameter("isbn", isbn); 

     boolean result = sp.execute(); 
     if (result == true) { 
      return sp.getResultList(); 
     } else { 
      // Handle the false for no result set returned, e.g. 
      throw new RuntimeException("No result set(s) returned from the stored procedure"); 
     } 
} 

} 

Теперь можно назвать эту конечную точку с stringquery как: http://localhost/api/books?isbn=1111111

Смежные вопросы