JDBC 유형에 대한 방언 매핑 없음: 1111
MySQL을 데이터베이스로 사용하여 Spring JPA 어플리케이션 작업을 하고 있습니다.모든 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
연동 테스트를 실행하면 스프링은 정상적으로 시작되지만 휴지 상태 Session Factory 작성에는 실패합니다.단, 다음과 같은 예외는 있습니다.
org.hibernate.MappingException: No Dialect mapping for JDBC type: 1111
제 사투리는 Mysql5Dialect가 되어야 한다고 생각합니다.또한 InnoDB라고 명시되어 있는 것과 버전5를 나타내지 않는 두 가지 사투리 옵션을 시도해 보았습니다.그러나 나는 항상 'No Language mapping for JDBC type: 1111'이라는 메시지가 나타난다.application.properties 파일은 test/resources 소스 폴더에 있습니다.JUnit Test Runner에 의해 인식됩니다(기존에 오타가 있어서 예외를 받았습니다).
설정 중인 속성이 잘못되었습니까?이러한 속성 이름에 대한 공식 문서를 찾을 수 없었지만 이 stackoverflow 답변에서 힌트를 찾았습니다.https://stackoverflow.com/a/25941616/1735497
답장기다리겠습니다!
BTW 응용 프로그램은 이미 스프링 부트를 사용하고 있습니다.
쿼리가 UUID 열을 반환했기 때문에 동일한 오류가 발생했습니다."cast(columnName as varchar)"와 같은 쿼리를 통해 UUID 열을 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();
}
}
다음은 차선책의 코멘트에 근거한 답변입니다.
이 오류 메시지는 실제로 하이버네이션에 의해 하나의 열 유형을 데이터베이스 유형에 매핑할 수 없음을 나타냅니다. 에는 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★.java.util.UUID
일부 엔티티에서 기본 키로 사용하는 유형입니다..@Type(type="uuid-char")
(postgres)의 경우)@Type(type="pg-uuid")
)
이 예외를 발생시키는 또 다른 일반적인 사용 사례도 있습니다." " " 를 void
자세한 내용과 솔루션에 대해서는 여기를 참조해 주세요.
일부 컬럼이 반환되는 경우 쿼리에서 알 수 없는 유형이 있는지 확인하십시오.
예: column_name의 '1'은 알 수 없는 유형일 수 있습니다.
1은 column_name이고 Integer는 1입니다.
이건 나한테 효과가 있었어.
동일한 오류가 발생했는데, DB에 저장된 UUID가 개체로 변환되지 않는 것이 문제입니다.
postgres @Type(type="pg-uuid")에 대해 @Type(type="uid") 주석을 적용하려고 했지만 작동하지 않았습니다.
이건 나한테 효과가 있었어.JPA에서 네이티브 쿼리를 사용하는 테이블에서 ID와 이름을 사용한다고 가정합니다.필드 ID와 이름을 사용하여 '사용자'와 같은 엔티티 클래스를 만든 다음 개체 []를 원하는 엔티티로 변환해 보십시오.이 일치된 데이터는 쿼리에서 얻은 개체 배열 목록입니다.
@Query( value = "SELECT CAST(id as varchar) id, name from users ", nativeQuery = true)
public List<Object[]> search();
public class User{
private UUID id;
private String name;
}
List<User> userList=new ArrayList<>();
for(Object[] data:matchedData){
userList.add(new User(UUID.fromString(String.valueOf(data[0])),
String.valueOf(data[1])));
}
이게 우리가 가지고 있는 실체라고 가정해봅시다
문제를 트리거한 열 찾기
먼저 엔티티 매핑을 제공하지 않았기 때문에 이 문제를 발생시킨 열을 알 수 없습니다.를 들면, 「 」, 「 」, 「 」, 「 」 입니다.UUID
★★★JSON
★★★★★★ 。
지금 당신은 아주 오래된 동면 사투리를 사용하고 있습니다.MySQL5Dialect
MySQL 5가 되다.MySQL을 사용하다
여러분도 , 이렇게 써보세요.MySQL8Dialect
★★★★
spring.jpa.database-platform=org.hibernate.dialect.MySQL8Dialect
비표준 유형 추가
JSON 컬럼 타입을 사용하고 있기 때문에 문제가 발생한 경우는, 비표준 타입을 서포트하는 커스텀 휴지 상태의 사투리를 입력해 주세요.
public class MySQL8JsonDialect
extends MySQL8Dialect{
public MySQL8JsonDialect() {
super();
this.registerHibernateType(
Types.OTHER, JsonStringType.class.getName()
);
}
}
ANS는 커스텀 휴지 상태 사투리를 사용합니다.
<property
name="hibernate.dialect"
value="com.vladmihalcea.book.hpjp.hibernate.type.json.MySQL8JsonDialect"
/>
SQL 네이티브쿼리 실행 시 이 예외가 발생할 경우 를 통해 유형을 전달해야 합니다.
JsonNode properties = (JsonNode) entityManager
.createNativeQuery(
"SELECT properties " +
"FROM book " +
"WHERE isbn = :isbn")
.setParameter("isbn", "978-9730228236")
.unwrap(org.hibernate.query.NativeQuery.class)
.addScalar("properties", JsonStringType.INSTANCE)
.getSingleResult();
assertEquals(
"High-Performance Java Persistence",
properties.get("title").asText()
);
sql 프로시저/함수를 호출할 때 반환이 필요할 수 있습니다.void: void를 해 볼 수 .RETURN;
스트링 RETURN 'OK'
기본 SQL 조회가 있는 경우 조회에 캐스트를 추가하여 수정합니다.
예:
CAST('yourString' AS varchar(50)) as anyColumnName
내 경우엔 효과가 있었다.
에는 '동면 상태'가였습니다. '휴면 상태'는 ' 상태', '휴면 상태', '휴면 상태'는 어떻게 해야 할지 .UUID
를 하고 있는 는, 이것을 Postgres 에 추가해 주세요.resources/application.properties
:
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQL9Dialect
내 경우 사용자 클래스에서 저장 프로시저를 설정할 때 resultClasses 속성을 추가하는 것을 잊었습니다.
@NamedStoredProcedureQuery(name = "find_email",
procedureName = "find_email", resultClasses = User.class, //<--I forgot that.
parameters = {
@StoredProcedureParameter(mode = ParameterMode.IN, name = "param_email", type = String.class)
}),
이 문제는 휴지 상태를 사용하여 보이드 함수를 반환할 때도 발생합니다.최소 포스트그레스 포함.보이드를 어떻게 다루는지 몰라나는 결국 나의 보이드를 리턴 인트로 바꿔야 했다.
Postgres를 사용하는 경우 Astime 유형의 열이 없는지 확인합니다.Astime은 JPA에 의해 인식되지 않는 내부 Postgres 데이터 유형입니다.이 경우 TO_CHAR을 사용하여 텍스트로 변환하는 것이 비즈니스 요건에 따라 허용된다면 도움이 될 수 있습니다.
다른 간단한 설명은 복잡한 유형(엔티티/POJO)을 가져오지만 매핑할 엔티티를 지정하지 않는 것입니다.
String sql = "select yourentity.* from {h-schema}Yourentity yourentity";
return entityManager.createNativeQuery(sql).getResultList();
createNativeQuery 메서드에서 매핑할 클래스를 추가합니다.
return entityManager.createNativeQuery(sql, Yourentity.class).getResultList();
Postgres를 사용하는 경우
public class CustomPostgreSqlDialect extends PostgreSQL94Dialect{
@Override
public SqlTypeDescriptor remapSqlTypeDescriptor(SqlTypeDescriptor sqlTypeDescriptor)
{
switch (sqlTypeDescriptor.getSqlType())
{
case Types.CLOB:
return VarcharTypeDescriptor.INSTANCE;
case Types.BLOB:
return VarcharTypeDescriptor.INSTANCE;
case 1111://1111 should be json of pgsql
return VarcharTypeDescriptor.INSTANCE;
}
return super.remapSqlTypeDescriptor(sqlTypeDescriptor);
}
public CustomPostgreSqlDialect() {
super();
registerHibernateType(1111, "string");
}}
및 사용
<prop key="hibernate.dialect">com.abc.CustomPostgreSqlDialect</prop>
이전 휴지 상태(3.x) 버전에서 이 오류가 발생하는 경우:
반환 유형을 대문자로 쓰지 마십시오.hibernate 타입 실장 맵핑에서는 소문자 리턴 타입이 사용되며 변환되지 않습니다.
CREATE OR REPLACE FUNCTION do_something(param varchar)
RETURNS integer AS
$BODY$
...
이것은 휴지 상태(5.x) 버전용입니다.
JSON 문자열/개체를 반환하는 호출 데이터베이스 함수
이 용도로unwrap(org.hibernate.query.NativeQuery.class).addScalar()
같은 방법을 사용하세요.
예: (스프링 및 휴지 상태)
@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();
}
함수 또는 프로시저가 보이드를 반환하면 JPA/Hibernate에 문제가 생깁니다.따라서 반환 정수로 변경하고 프로시저의 마지막에 반환 1을 호출하면 문제가 해결될 수 있습니다.
SQL Type 1111은 String을 나타냅니다.
EntityManager.createNativeQuery()를 호출하는 경우 두 번째 파라미터에 결과 Java 클래스를 포함해야 합니다.
return em.createNativeQuery(sql, MyRecord.class).getResultList()
다음을 포함한 많은 제안 솔루션을 시도한 후:
- https://stackoverflow.com/a/59754570/349169은 여기서 제안하는 솔루션 중 하나입니다.
- https://vladmihalcea.com/hibernate-no-dialect-mapping-for-jdbc-type/
결국 가장 적은 양의 변경으로 모든 것을 고친 것이 바로 이것입니다.
https://gist.github.com/agrawald/adad25d28bf6c56a7e4618fe95ee5a39
비결은 이 모든 것을 갖지 않는 것이다.@TypeDef
대신 두 가지 다른 것을 가지세요.@TypeDef
2가지로 나누다package-info.java
파일. 하나는 프로덕션 DB용 프로덕션 코드 패키지 안에 있고 다른 하나는 테스트 H2 DB용 테스트 패키지 안에 있습니다.
언급URL : https://stackoverflow.com/questions/28192547/no-dialect-mapping-for-jdbc-type-1111
'programing' 카테고리의 다른 글
Python에서 다양한 날짜로 반복 (0) | 2023.01.01 |
---|---|
String을 Title Case로 변환하는 방법이 있나요? (0) | 2023.01.01 |
Windows 10에서는 MariaDB와 MySQL이 매우 느리다 (0) | 2023.01.01 |
공통 MySQL 필드 및 해당 데이터 유형 (0) | 2023.01.01 |
호스트에서 도커 컨테이너의 mysql에 연결 (0) | 2023.01.01 |