Нет отображения диалектов для типа 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();
}