私はストアドプロシージャを呼び出すために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
8000のバイトは聞き覚え。私は風のようにグーグルリングをお勧めします。 – Kayaman
私は試しました。確定的なものが見つからないようです。 – James
かなりの研究の後、2歳以上のバグのようです。私は間違っていると思いますが、解決されました。これは致命的な問題です。私は、Microsoft SQL Serverドライバを使用することはできません。それは、それ自身の致命的な問題で、デフォルト以外の値を持つパラメータを宣言する必要があります。 – James