является закодированным именем типа для байтового массива (byte []), который обычно должен появляться только в строках сигнатур типа, поскольку это недопустимое имя типа.

аюсь получить зашифрованный проход MD5 из БД MySQL через код Java (Hibernate). Но я не могу получить ни String, ни какой-либо разумный тип 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)

Ответы на вопрос(4)

[B является закодированным именем типа для байтового массива (byte []), который обычно должен появляться только в строках сигнатур типа, поскольку это недопустимое имя типа.

Это имя классаbyte[].class, Попробуй это:

System.out.println(byte[].class.getName());

Вывод (как вы уже догадались):

[B

И если вы хотите получить доступ к читаемому имени, используйтеClass.getCanonicalName():

System.out.println(byte[].class.getCanonicalName());

Выход:

байт[]

Решение Вопроса

([) байтов (B). Массив целых[I и т.п.

Вы можете получить немного больше информации о дескрипторах поля здесь:
Типы JNI и структуры данных (Таблица 3-2 должно быть то, что вы ищете).

 Kasnady24 июл. 2018 г., 03:48
@ rfeak ссылка устарела. Можете ли вы опубликовать новую ссылку?
 Xorty05 янв. 2011 г., 18:19
Спасибо, вы были очень полезны!
 Bruno Ferreira19 нояб. 2018 г., 14:37
@Kasnady Я исправил ссылки :)

Если вы хотите получить строку из байтового массива, используйте конструктор 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();
}
 Xorty05 янв. 2011 г., 18:21
отлично, но это действительно странное поведение! Эта строка в точности совпадает с той, что печатает консоль MySQL. Но pass.getBytes (). Length говорит, что его 32, а MD5 должен быть 128 бит. Где я потерял ключ?
 Evan Mulawski05 янв. 2011 г., 18:25
@ Xorty: Существует разница между измерением уровня шифрования и длиной строки. MD5 преобразует любой ввод в строку, содержащую не более и не менее 32 шестнадцатеричных символов.
 Xorty05 янв. 2011 г., 18:30
Здорово, миф лопнул;)

Ваш ответ на вопрос