Java Spring Boot,JPA,@Query,Sybase存储过程
正在尝试使用JPA@Query进行Sybase存储过程调用。我遵循这里提供的信息作为指导,尽管这些信息是针对MySQL和命名参数的。我知道存储过程可以工作,因为我可以使用客户机DBVis执行它。我还知道存储过程的值是正确的,因为我打开了hibernate日志记录,每次调用之前都会看到以下代码片段:Java Spring Boot,JPA,@Query,Sybase存储过程,java,spring-boot,sybase,Java,Spring Boot,Sybase,正在尝试使用JPA@Query进行Sybase存储过程调用。我遵循这里提供的信息作为指导,尽管这些信息是针对MySQL和命名参数的。我知道存储过程可以工作,因为我可以使用客户机DBVis执行它。我还知道存储过程的值是正确的,因为我打开了hibernate日志记录,每次调用之前都会看到以下代码片段: 2020-12-30 13:51:07 TRACE o.h.t.d.sql.BasicBinder - binding parameter [1] as [VARCHAR] - [pub_req_t]
2020-12-30 13:51:07 TRACE o.h.t.d.sql.BasicBinder - binding parameter [1] as [VARCHAR] - [pub_req_t]
2020-12-30 13:51:07 TRACE o.h.t.d.sql.BasicBinder - binding parameter [2] as [INTEGER] - [1]
@Query如下所示:
@Query(value = "call rp_surrogate(?1, ?2);", nativeQuery = true)
int getSurrogateByQueryV1(String surrtype, Integer newsurr );
存储过程声明是:
CREATE PROCEDURE dbo.rp_surrogate (
@surrtype char(32),
@newsurr domn_num_id output
)
as begin
我传递给?2(输出)参数的内容似乎并不重要,因为它被忽略了。我尝试过jconn4版本7.0和jtds版本1.3.1 JDBC驱动程序……它们都会产生相同的异常:
- jconn4-由以下原因引起:com.sybase.jdbc4.jdbc.SybSQLException:“@p0”附近的语法不正确
- jtds-原因:java.sql.SQLException:“@P0”附近的语法不正确
- 弹簧靴2.2.8
- Java 1.8
- Sybase ASE 15
@Modifying
@Query(value = "call rp_surrogate(?1, ?2);", nativeQuery = true)
@Transactional(rollbackFor=Exception.class)
int getSurrogateByQueryV1(String surrtype, Integer newsurr );
Results in : Caused by: com.sybase.jdbc4.jdbc.SybSQLException: Incorrect syntax near '@p0'.
另外,在@Query上尝试了4种变体,它们都返回相同的异常…一些带有分号,一些带有调用
@Query(value = "call rp_surrogate(?1, ?2)", nativeQuery = true)
int getSurrogateByQueryV1(String surrtype, Integer newsurr );
Results in : Caused by: java.sql.SQLException: Incorrect syntax near '@P0'.
@Query(value = "call rp_surrogate(?1, ?2);", nativeQuery = true)
int getSurrogateByQueryV2(String surrtype, Integer newsurr );
Results in : Caused by: java.sql.SQLException: Incorrect syntax near '@P0'.
@Query(value = "rp_surrogate(?1, ?2);", nativeQuery = true)
int getSurrogateByQueryV3(String surrtype, Integer newsurr );
Results in : Caused by: java.sql.SQLException: Incorrect syntax near '@P0'.
@Query(value = "rp_surrogate(?1, ?2)", nativeQuery = true)
int getSurrogateByQueryV4(String surrtype, Integer newsurr );
Results in : Caused by: java.sql.SQLException: Incorrect syntax near '@P0'.
关于我能报告的唯一有效的事情是以下内容,这是有效的,但我们希望使用@Query创建一个干净/精简的版本,因为我们需要调用的一些过程的参数相当大
@Override
public int getSurrogateByType(String typeSurrogate) {
EntityManager em = secondaryEntityManager.getObject().createEntityManager();
StoredProcedureQuery query = em.createStoredProcedureQuery("rp_surrogate");
// JDBC : The jconn and jtDS drivers do NOT understand named parameters...we
// MUST use positional...
//query.registerStoredProcedureParameter("surrtype", String.class, ParameterMode.IN );
//query.registerStoredProcedureParameter("newsurr", Long.class, ParameterMode.OUT );
query.registerStoredProcedureParameter(1, String.class, ParameterMode.IN);
query.registerStoredProcedureParameter(2, Integer.class, ParameterMode.OUT);
getLog().error("getSurrogateByType() - Surrogate Type [{}]", typeSurrogate);
query.setParameter(1, typeSurrogate);
try {
query.execute();
} catch (Exception ltheXcp) {
getLog().error("{}() - process failure, with exception(s) : ", this.getClass().getSimpleName(), ltheXcp);
ltheXcp.printStackTrace();
throw ltheXcp;
}
Integer commentCount = (Integer) query.getOutputParameterValue(2);
return commentCount.intValue();
}
有人知道如何使用Sybase驱动程序和@Query进行此类调用吗?您可以直接在Sybase中进行查询吗?你试过那里有用的吗?sybase总是有错误,因为它需要所有者名称,例如dbo.rp_subrogate(),应用程序中配置了哪种方言?是的,我们可以使用JPA存储库和实体从表等中获取记录。方言是org.hibernate.dialogue.sybasedialogue。您是否尝试过类似解释的
@过程
,如果它有任何区别?