如何在Spring Boot JPA项目中设置JDBC映射?

时间:2019-02-08 11:47:19

标签: java spring-boot spring-data-jpa

我有一个postgres表t1,其中的列类型如uuid和带有区域的时间戳记等,导致

org.springframework.orm.jpa.JpaSystemException: No Dialect mapping for JDBC type: 1111; nested exception is org.hibernate.MappingException: No Dialect mapping for JDBC type: 1111

如果我尝试获取类型为int或varchar的d列,我的代码可以正常工作,但是当我尝试包含数据类型为uuid或date类型的列时,它会失败,并出现上述异常。

因此,我有一个存储库接口类,该类扩展了我的CustomRepository接口,该接口又由另一个类实现,以实现如下所示的自定义查询:

@Repository
interface Repo extends JpaRepository<Entity, UUID>, CustomRepo {
    // some repo methods
}

interface CustomRepo {
    List queryBy(Type1 par1, Type2 par2);
}

@Service
class CustomRepoImpl implements CustomRepo {
    @PersistenceContext
    private EntityManager entityManager;

    public List queryBy(Type1 par1, Type2 par2) {
        query_string = "SOME QUERY STRING WITH JOINS";
        Query query = entityManager.createNativeQuery(query_string);
        List<Object[]> resultList = (List<Object[]>) query.getResultList(); // giving No Dialect mapping for JDBC type: 1111
        return resultList;
    }
}

所以当我的query_string选择int或varchar类型的列时,我没有遇到任何问题,但是当我尝试选择tyoe uuid的列时,我遇到了上述异常,可能是因为找不到对应的Java映射。

如何避免这种情况?无论如何,我可以为查询显式添加映射以获取这些列类型吗?

2 个答案:

答案 0 :(得分:1)

根据错误消息,无法通过休眠将uuid列类型映射到数据库类型。其中可能是java.util.UUID类型。

因此,只需为您的UUID类型应用注释@Type(type="uuid-char")

您还可以在HERE中为Hibernate中的字段检查所需的类型,并可以进行相应的使用。

答案 1 :(得分:0)

所以我遇到了这些错误,因为我选择的某些列在postgres中是uuid类型。我猜他们无法映射到适当的数据类型,如varchar如何映射到字符串。所以我更改了我的SQL查询以将列转换为varchar。例如,假设我在表t1中的列c1的类型为uuid,那么我在sql查询中这样做:

SELECT CAST(t1.c1 AS VARCHAR) .....REST_OF_THE_QUERY

因此,这将导致我的列值作为varchar返回,然后将其视为字符串。

不确定是否有其他选择,但这是我能想到的最好的选择。如果有人知道更好的方法,可以在这里分享。