gpt4 book ai didi

java - Spring Boot、JPA、@Query、Sybase 存储过程

转载 作者:行者123 更新时间:2023-12-05 06:54:32 25 4
gpt4 key购买 nike

尝试使用 JPA @Query 调用 Sybase 存储过程。我正在关注此处提供的信息,https://www.baeldung.com/spring-data-jpa-stored-procedures ,作为指南,即使信息是针对 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”附近的语法不正确。

运行时堆栈:

  • Spring 启动 2.2.8
  • Java 1.8
  • Sybase ASE 15

我试过将@Modifying 注释与@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 native 查询不支持“调用”和使用“exec”

@Query(value = "exec rp_surrogate  ?1, ?2 ", nativeQuery = true)
int getSurrogateByQueryV1(String surrtype, Integer newsurr );

关于java - Spring Boot、JPA、@Query、Sybase 存储过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65512600/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com