Java Spring Boot,JPA,@Query,Sybase存储过程

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]

正在尝试使用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 [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
我已经尝试将@modify annotation与@Trasactional结合使用:我认为JPA可能会将@P0用作行支持或存储过程的状态代码……不

@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。您是否尝试过类似解释的
@过程
,如果它有任何区别?