JDBC类型的无Dialect映射:1111

Sak*_*Big 26 java mysql spring hibernate jpa

我正在使用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
Run Code Online (Sandbox Code Playgroud)

执行集成测试时,spring正常启动但在创建hibernate SessionFactory时失败,但有异常:

org.hibernate.MappingException: No Dialect mapping for JDBC type: 1111
Run Code Online (Sandbox Code Playgroud)

我认为我的方言应该是Mysql5Dialect,我也试过一个明确说明InnoDB,以及两个方言选项,它们不指示版本5.但我总是得到相同的'没有Dialect映射的JDBC类型:1111'消息.我的application.properties文件驻留在test/resources源文件夹中.它被JUnit Test跑者认可(我以前因为打字错误而得到例外).

属性我设置错了吗?我找不到关于这些属性名称的一些官方文档,但在这个stackoverflow答案中找到了一个提示:https://stackoverflow.com/a/25941616/1735497

期待您的回答,谢谢!

BTW该应用程序已使用弹簧启动.

Sak*_*Big 18

这里的答案基于SubOptimal的评论:

错误消息实际上表示一个列类型无法通过hibernate映射到数据库类型.就我而言,它是java.util.UUID我在某些实体中用作主键的类型.只需应用注释@Type(type="uuid-char")(适用于postgres @Type(type="pg-uuid"))

  • 如果您仅在 HSQLDB 的测试环境中遇到异常 - 请查看 http://stackoverflow.com/questions/1007176/using-different-hibernate-user-types-in-different-situations (2认同)

icl*_*126 11

还有另一个常见的用例抛出此异常.调用返回的函数void.欲了解更多信息和解决方案去这里.


小智 10

我遇到了同样的错误,因为我的查询返回了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();
    }
}
Run Code Online (Sandbox Code Playgroud)


小智 9

我遇到了同样的错误,这里的问题是存储在 DB 中的 UUID 没有转换为对象。

我尝试应用这些注释 @Type(type="uuid-char") (对于 postgres @Type(type="pg-uuid") 但它对我不起作用。

这对我有用。假设您希望使用 JPA 中的本机查询从表中获取 id 和 name。使用字段 id 和 name 创建一个像“User”这样的实体类,然后尝试将 object[] 转换为我们想要的实体。这里匹配的数据是我们从查询中获取的对象数组列表。

@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])));

    }
Run Code Online (Sandbox Code Playgroud)

假设这是我们拥有的实体


jas*_*ngh 8

请检查一些列是否返回多个在查询中有未知类型.

例如:'1'作为column_name 可以具有未知类型

1作为column_name是Integer 是正确的.

这件事对我有用.

  • 我有一个带有我自己的SqlResultMapping的本地查询,这就是问题所在,通过将强制转换添加到查询''CAST('staticstring'AS varchar(50))作为columnmappingname来解决此问题。 (2认同)

Vla*_*cea 6

查找触发问题的列

首先,您没有提供实体映射,以便我们可以判断是哪个列产生了这个问题。例如,它可以是UUIDJSON列或一列。

现在,您正在使用一种非常古老的 Hibernate 方言。这MySQL5Dialect适用于 MySQL 5。很可能您使用的是较新的 MySQL 版本。

因此,请尝试MySQL8Dialect改用:

spring.jpa.database-platform=org.hibernate.dialect.MySQL8Dialect
Run Code Online (Sandbox Code Playgroud)

添加非标准类型

如果您因为使用 JSON 列类型而遇到问题,请尝试提供支持非标准类型的自定义 Hibernate Dialect:

public class MySQL8JsonDialect
        extends MySQL8Dialect{
 
    public MySQL8JsonDialect() {
        super();
        this.registerHibernateType(
            Types.OTHER, JsonStringType.class.getName()
        );
    }
}
Run Code Online (Sandbox Code Playgroud)

Ans 使用自定义 Hibernate 方言:

<property
    name="hibernate.dialect"
    value="com.vladmihalcea.book.hpjp.hibernate.type.json.MySQL8JsonDialect"
/>
Run Code Online (Sandbox Code Playgroud)

如果在执行 SQL 本机查询时遇到此异常,则需要通过以下方式传递类型addScalar

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()
);
Run Code Online (Sandbox Code Playgroud)