Нет отображения диалектов для типа JDBC: 1111

Я работаю над приложением Spring JPA, используя MySQL как базу данных. Я гарантировал, что загружаются все библиотеки spring -jpa, hibernate и mysql-connector-java.

Я запускаю экземпляр mysql 5. Вот фрагмент моего файла application.properties:

spring.jpa.show-sql=false
spring.jpa.hibernate.ddl-auto=create-drop
spring.jpa.database-platform=org.hibernate.dialect.MySQL5Dialect

spring.datasource.url=jdbc:mysql://localhost/mydatabase
spring.datasource.username=myuser
spring.datasource.password=SUPERSECRET
spring.datasource.driverClassName=com.mysql.jdbc.Driver

При выполнении теста интеграции Spring запускается правильно, но не удается создать спящий SessionFactory, за исключением:

org.hibernate.MappingException: No Dialect mapping for JDBC type: 1111

Я думаю, что мои диалекты должны быть Mysql5Dialect, я также попробовал тот, который явно указал InnoDB, и два варианта диалекта, которые не указывают на версию 5. Но я всегда получаю одно и то же "Диалоговое отображение" Нет диалектов "для типа JDBC: 1111 '. Мой файл application.properties находится в исходной папке test/resources. Он распознается бегунком JUnit Test (ранее я получил исключение из-за опечатки).

Являются ли свойства, которые я устанавливаю неправильно? Я не мог найти официальную документацию по этим именам свойств, но нашел подсказку в этом ответе stackoverflow: qaru.site/info/497134/...

Ждем ваших ответов, спасибо!

BTW Приложение уже использует загрузку Spring.

Ответ 1

Здесь ответ основан на комментарии SubOptimal:

В сообщении об ошибке фактически указывается, что один тип столбца не может быть сопоставлен с типом базы данных с помощью спящего режима. В моем случае это был тип java.util.UUID, который я использую как первичный ключ в некоторых моих сущностях. Просто примените аннотацию @Type(type="uuid-char") (для postgres @Type(type="pg-uuid"))

Ответ 2

Существует также еще один распространенный случай использования, который бросает это исключение. Функция вызова, которая возвращает void. Для получения дополнительной информации и решения перейдите здесь.

Ответ 3

Я получил ту же ошибку, потому что мой запрос возвратил столбец UUID. Чтобы исправить это, я возвратил столбец UUID как тип varchar через запрос типа "cast (columnName as varchar)", затем он сработал.

Пример:

public interface StudRepository extends JpaRepository<Mark, UUID> {

    @Modifying
    @Query(value = "SELECT Cast(stuid as varchar) id, SUM(marks) as marks FROM studs where group by stuid", nativeQuery = true)
    List<Student> findMarkGroupByStuid();

    public static interface Student(){
        private String getId();
        private String getMarks();
    }
}

Ответ 4

Пожалуйста, проверьте, есть ли в некоторых столбцах много значений unknow Type в запросе.

например: '1', поскольку имя_столбца может иметь неизвестный тип

и 1, поскольку column_name Integer правильный.

Эта вещь работала для меня.

Ответ 5

Иногда, когда вы вызываете процедуру/функцию sql, может потребоваться что-то вернуть. Вы можете попробовать вернуть void: RETURN; или string (это работало для меня): RETURN 'OK'

Ответ 6

В моем случае проблема была в том, что я забыл добавить атрибут resultClasses при настройке хранимой процедуры в своем классе User.

@NamedStoredProcedureQuery(name = "find_email",
                procedureName = "find_email", resultClasses = User.class, //<--I forgot that. 
                parameters = {
                    @StoredProcedureParameter(mode = ParameterMode.IN, name = "param_email", type = String.class)
                }),

Ответ 7

Для всех, кто получает эту ошибку со старой версией hibernate (3.x):

не писать тип возврата заглавными буквами. сопоставление реализации типа hibernate использует строчные возвращаемые типы и не преобразует их:

CREATE OR REPLACE FUNCTION do_something(param varchar)
    RETURNS integer AS
$BODY$
...

Ответ 8

Это также происходит, когда вы используете Hibernate и возвращаете функцию void. По крайней мере, с Postgres. Он не знает, как справиться с пустотой. Я закончил тем, что изменил свою пустоту на возврат int.

Ответ 9

Если вы используете Postgres, убедитесь, что у вас нет столбца типа Abstime. Abstime - это внутренний тип данных Postgres, не распознаваемый JPA. В этом случае преобразование в текст с использованием TO_CHAR может помочь, если это разрешено вашими бизнес-требованиями.

Ответ 10

Если у вас есть собственный запрос SQL, то исправьте его, добавив приведение к запросу.

Пример:

CAST('yourString' AS varchar(50)) as anyColumnName

В моем случае это сработало для меня.

Ответ 11

Это для версии Hibernate (5.x)

Вызов функции базы данных, которая возвращает строку/объект JSON

для этого использовались методы unwrap (org.hibernate.query.NativeQuery.class).addScalar() для того же

Пример как показано ниже (Spring & Hibernate)

@PersistenceContext

EntityManager em;

@Override

public String getJson(String strLayerName) {

    String *nativeQuery* = "select fn_layer_attributes(:layername)";

    return em.createNativeQuery(*nativeQuery*).setParameter("layername", strLayerName).**unwrap(org.hibernate.query.NativeQuery.class).addScalar**("fn_layer_attributes", **new JsonNodeBinaryType()**) .getSingleResult().toString();

}