2016-10-07 1 views
1

私は、多くのオプションパラメータを持つサードパーティのストアドプロシージャを呼び出しています。これは、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のパラメータを定義する必要はありません。私がそれをしたとしても、私はそれらをヌルにすることはできません。

答えて

0

MicrosoftのJDBCドライバを使用することはできません。二つのオプション:

  1. 利用のjTDS(ストアドプロシージャが返した場合のオプションではありません> 8000バイト)
  2. のみ必要と、それは他のストアドプロシージャを呼び出す持っているのparamsを持っているラッパーのストアドプロシージャを作成します。 。これは、データベースにストアドプロシージャを作成する権限がない場合は、オプションではない可能性があります。

私の場合、オプション2は、ストアドプロシージャを作成する権限があるために機能します。

関連する問題