私は、多くのオプションパラメータを持つサードパーティのストアドプロシージャを呼び出しています。これは、MS SQL Server 2008 R2でだと次のようになります。JPA - オプションのパラメータを指定せずにストアドプロシージャを呼び出すことはできますか?
procedure [dbo].[pTest]
@ReportDate varbinary(max) out,
@Optional1 varchar(max) = null,
@Optional2 varbinary(max) = null,
@Date varchar(max) = null,
-- ~20 more optional params of various types
as
begin
select * from test
end
私はcom.microsoft.sqlserverのsqljdbc 4.2で春データJPA 1.10.2を使用してJavaからそれを呼んでいます。
私はこれまで、2つのパラメータ、ReportDateとDateを使用してプロシージャを呼び出す必要がありました。残りのパラメータはデフォルト値(null)にとどまります。次のように私のコードは次のとおりです。
@Entity
@NamedStoredProcedureQuery(name = "Test.get", procedureName = "pTest", parameters = {
@StoredProcedureParameter(mode = ParameterMode.OUT, name = "ReportData", type = byte[].class),
@StoredProcedureParameter(mode = ParameterMode.IN, name = "Date", type = String.class)
})
public class Test {
// serves no purpose other than to meet
// JPA requirement
@Id
private byte[] reportData;
}
春データリポジトリ:
public interface TestRepository extends Repository<Test, Long> {
@Procedure("pTest")
byte[] get(@Param("Date") String date);
}
テストコード:
@RunWith(SpringRunner.class)
@SpringBootTest
@Transactional(transactionManager="transactionManager")
public class TestRepositoryTest {
@Autowired
private TestRepository testRepository;
@Test
public void testGet() throws SQLException {
byte[] blob = testRepository.get("hi");
//error occurs
}
}
私も次のエラーを取得する:
o.h.engine.jdbc.spi.SqlExceptionHelper : Error preparing CallableStatement [pTest]
com.microsoft.sqlserver.jdbc.SQLServerException: The index 4 is out of range.
at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(SQLServerException.java:191) ~[sqljdbc-4.2.jar:na]
私は」オプションを指定しなかったのでこれを取得するal1とOptional2。ここで、Optional1とOptional2を@StoredProcedureParameter
として追加し、TestRepository
のgetTestメソッドへのパラメータとして、私はもはやエラーを取得しません。しかし、その後、null以外の値を渡す必要があります。それ以外の場合は、値を渡したというエラーが表示されます。
このストアドプロシージャを、好ましくはOptional1とOptional2を指定せずに呼び出すにはどうすればよいですか?
場合によっては、15番目のパラメータを設定する必要があるストアドプロシージャを呼び出す必要があります。私は本当に自分のコードで他の14のパラメータを定義する必要はありません。私がそれをしたとしても、私はそれらをヌルにすることはできません。