我正在尝试调用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");
}
我没有用注释解决这个问题,我用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