2016-10-06 7 views
0

私はストアドプロシージャを呼び出すためにSpring Data JPA 1.10.2とjTds 1.3.1を使用しています。JDBC-varbinary(max)outパラメータが8000バイトに切り捨てられます

ストアドプロシージャには、varbinary(max)型の出力パラメータ@dataがあります。 @dataには約10,000バイトが含まれます。

ここでは、ストアード・プロシージャーのシグニチャーです:

ALTER procedure [User].[pTest] 
     @data varbinary(max) out 
     ,@name nvarchar(max) = null 
     ,@date datetime 
as 
begin 
. 
. 
. 

私のエンティティクラスは次のとおりです。

@Entity 
@NamedStoredProcedureQuery(name = "User.getUser", procedureName = "User.pTest", parameters = { 
     @StoredProcedureParameter(mode = ParameterMode.OUT, name = "data", type = byte[].class), 
     @StoredProcedureParameter(mode = ParameterMode.IN, name = "name", type = String.class), 
     @StoredProcedureParameter(mode = ParameterMode.IN, name = "date", type = Date.class) 
      }) 
@Data //lombok 
public class User { 


    // serves no purpose other than to meet 
    // JPA requirement 
    @Id 
    private Long id; 
} 

リポジトリコードが

public interface UserRepository extends Repository<User, Long> { 

    @Procedure("User.pTest") 
    byte[] getUserSession(@Param("name") String name, 
      @Param("date") Date date 
      ); 

} 

私のテストコードは以下のようであり、私が実行されますそれはエラーが表示されます:

@Test 
public void testGettingApxSession() { 
    Calendar cal = new GregorianCalendar(2016,6,5); 
    byte[] b = userRepository.getUserSession("myName", cal.getTime()); 
} 

私が使用して@dataをログアウト:

StringBuilder sb = new StringBuilder(); 
    for (byte a : b) { 
     sb.append(String.format("%02X ", a)); 
    } 

を私は唯一の8000バイトが返されていることに気づきました。 SQL Server Management Studioで同じストアドプロシージャを実行すると、〜10,000バイトがあり、16進数コードFFFFのように終了することがわかりました。

Javaアプリケーションからストアドプロシージャを実行すると、結果が切り捨てられているようです。

この切り詰めを防ぐにはどうすればよいですか?バイト[]の代わりにvarbinary(max)に指定する必要がある別のデータ型がありますか?

更新

私はまた、MicrosoftのJDBCドライバ(V 6.0.7728.100)を試してみましたし、同じ問題を経験してきました。私の推測では、JDBCドライバ(私は思う)は、最大数であるnであることに基づいて最大値を8000とし、varbinary(n)で指定できます。しかし、varbinaryの最大容量は8000よりはるかに大きく、varbinary(max)で指定されます。 varbinary(max)は2^31-1バイトを保持できます。私の質問およびの他の回答here

+0

8000のバイトは聞き覚え。私は風のようにグーグルリングをお勧めします。 – Kayaman

+0

私は試しました。確定的なものが見つからないようです。 – James

+0

かなりの研究の後、2歳以上のバグのようです。私は間違っていると思いますが、解決されました。これは致命的な問題です。私は、Microsoft SQL Serverドライバを使用することはできません。それは、それ自身の致命的な問題で、デフォルト以外の値を持つパラメータを宣言する必要があります。 – James

答えて

0

使用MicrosoftのJDBCドライバを参照してくださいBlobとして出力パラメータのタイプを指定します。

@Entity 
@NamedStoredProcedureQuery(name = "User.getUser", procedureName = "User.pTest", parameters = { 
     @StoredProcedureParameter(mode = ParameterMode.OUT, name = "data", type = Blob.class), 
     @StoredProcedureParameter(mode = ParameterMode.IN, name = "name", type = String.class), 
     @StoredProcedureParameter(mode = ParameterMode.IN, name = "date", type = Date.class) 
      }) 

注:これはのjTDSでは動作しません。まだ8000バイトを超えるものは切り捨てられます。

Blobが戻ってSQL Serverに渡す必要がある場合は、次のように、あなたが戻ってバイト配列に変換する必要がありますが:

byte[] bytes = blob.getBytes(1, (int) blob.length()); 
関連する問題