当前位置: 首页 > 知识库问答 >
问题:

使用JPA2.1注释调用SQL server存储过程

左丘昕
2023-03-14

我正在尝试调用MSSQL服务器存储过程。我使用spring-boot, JPA 2.1, hibernate。

数据库有一个表,其中包含 isbn、标题、作者、描述,我尝试调用的存储过程将一个 in parameter(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");
    }

共有1个答案

戴浩初
2023-03-14

我没有用注释解决这个问题,我用EntityManager和StoredProcedureQuery解决了这个问题。

这本书.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"); 
        }
}

}

现在可以用字符串query调用这个endpoint,比如:http://localhost/api/books?isbn=1111111

 类似资料:
  • 本文向大家介绍sqlserver中存储过程的递归调用示例,包括了sqlserver中存储过程的递归调用示例的使用技巧和注意事项,需要的朋友参考一下 递归式指代码片段调用自身的情况;危险之处在于:如果调用了自身一次,那么如何防止他反复地调用自身。也就是说提供递归检验来保证适当的时候可以跳出。 以阶层为例子说存储过程中递归的调用。 递归 当创建此存储过程时候,会遇见一条报告信息

  • 我有一个在包中定义的存储过程。该过程接受两个参数,一个是游标: 我是这样调用这个过程的: 它将返回以下错误: 你好,阿尼尔班。

  • 我使用JDBC这样调用这个过程: 它向我抛出一个错误,通知调用格式错误。 但是如果我像这样直接在IDE中运行调用:

  • 从1.r.58开始, 支持出参, 之前的版本仅支持入参. 从实现方式上说, 是通过扩展自定义SQL的含义及上下文来实现 仅含义入参的存储过程 // 建表,删除老的存储过程. dao.create(Pet.class, true); dao.insert(Pet.create("wendal")); dao.execute(Sqls.create("DROP PRO

  • 问题内容: 我试图在postgres 9.3上使用sql调用函数内的函数。 这个问题与我的另一篇文章有关。 我写了下面的函数。到目前为止,我还没有合并任何类型的save-output(COPY)语句,因此我试图通过创建嵌套函数print-out函数来解决此问题。 以上功能有效。 尝试创建嵌套函数。 调用嵌套函数。 输出 上面给出了这个。但是,当在print_out()中将arg1,arg2替换为’

  • 主要内容:创建CallableStatement对象,关闭CallableStatement对象,JDBC SQL转义语法在讨论JDBC Statement教程文章时,我们已经学习了如何在JDBC中使用存储过程。 本教程文章与该部分类似,但它将讲解演示有关JDBC SQL转义语法的其他信息。 就像对象创建和对象一样,它可使用同样的方式创建对象,该对象将用于执行对数据库存储过程的调用。 创建CallableStatement对象 假设需要执行以下Oracle存储过程 - 注意:上面的存储过程是为O