Javaコード(Hibernate)を介してMySQL DBからMD5暗号化パスを取得しようとしています。しかし、文字列も妥当なJavaタイプも取得できません。
私が得ている唯一のことは、この役に立たないメッセージです:Java.lang.ClassCastException:[Bはcom.mysql.jdbc.Blobにキャストできません(またはJavaキャストしてみるタイプ)。
これが私の方法です:
public void testCrypto() {
session.beginTransaction();
// creates native SQL query
// uses native MySQL's MD5 crypto
final Blob pass = (Blob) session.createSQLQuery("SELECT MD5('somePass')")
.list().get(0);
session.getTransaction().commit();
}
これが完全なスタックトレースです。
Java.lang.ClassCastException: [B cannot be cast to com.mysql.jdbc.Blob
at domain.DatabaseTest.testCrypto(DatabaseTest.Java:57)
at Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at Sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at Sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at Java.lang.reflect.Method.invoke(Unknown Source)
at junit.framework.TestCase.runTest(TestCase.Java:168)
at junit.framework.TestCase.runBare(TestCase.Java:134)
at junit.framework.TestResult$1.protect(TestResult.Java:110)
at junit.framework.TestResult.runProtected(TestResult.Java:128)
at junit.framework.TestResult.run(TestResult.Java:113)
at junit.framework.TestCase.run(TestCase.Java:124)
at junit.framework.TestSuite.runTest(TestSuite.Java:232)
at junit.framework.TestSuite.run(TestSuite.Java:227)
at org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.Java:83)
at org.Eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.Java:49)
at org.Eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.Java:38)
at org.Eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.Java:467)
at org.Eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.Java:683)
at org.Eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.Java:390)
at org.Eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.Java:197)
私の友達はバイトの配列です。 JNIでは、[Bは配列を記述するために使用されます([
)バイト(B
)。 intの配列は[I
など。
ここでフィールド記述子に関するもう少し情報を得ることができます:
JNIタイプとデータ構造 ( 表3-2 はあなたが探しているものでなければなりません)。
_byte[].class
_のクラス名です。これを試して:
_System.out.println(byte[].class.getName());
_
出力(あなたはそれを推測しました):
[B
また、読み取り可能な名前にアクセスする場合は、 Class.getCanonicalName()
を使用します。
_System.out.println(byte[].class.getCanonicalName());
_
出力:
バイト[]
他の回答が述べているように、それはバイト配列です。
バイト配列から文字列を取得する場合は、Stringコンストラクターを使用します。
public void testCrypto()
{
session.beginTransaction();
// creates native SQL query
// uses native MySQL's MD5 crypto
final String pass = new String(session.createSQLQuery("SELECT MD5('somePass')")
.list().get(0));
session.getTransaction().commit();
}
[B
は、バイト配列(byte [])のエンコードされた型名です。これは、有効な型名ではないため、通常は型署名文字列にのみ表示されます。