【问题标题】:No Dialect mapping for JDBC type: 2003没有 JDBC 类型的方言映射:2003
【发布时间】:2014-03-05 00:28:15
【问题描述】:

虽然这个标题存在一些问题,但我的查询并没有从这些线程中解决。

我在postgres中通过hibernate执行递归(使用with子句)查询,查询结果也包含搜索路径

ex:一行查询结果

5811;"axyz_3_3";"ABC";5782;5811;5797;4;"**{acl_3_3,acl3_4,acl3,acl_3_3}**";t;t

hibernate 是否有除 String 之外的 "{acl_3_3,acl3_4,acl3,acl_3_3}" 的任何映射类型, 类似于CHARACTER_ARRAYCHAR_ARRAY

以下是查询输出的示例

id   |name|discri|pId|asscID|immeId|depth|path|cycle|canDelete
5797;"abc3";"abc";5782;5811;5788;7;"{abc_3_3,abc3_4,abc3,abc4}";t;f
5797;"abc3";"abc";5782;5786;5813;6;"{abc1,abc2,abc3,abc3}";t;f
5799;"abc4";"abc";5782;5811;5786;6;"{abc_3_3,abc3_4,abc4}";t;f
5788;"abc2";"abc";5782;5811;5786;6;"{abc_3_3,abc3_4,abc2}";f;f
5786;"abc1";"abc";5782;5786;5799;5;"{abc1,abc2,abc3,abc1}";t;f
5797;"abc3";"abc";5782;5786;5813;5;"{abc1,abc2,abc3,abc3}";t;f
5813;"abc3_4";"abc";5782;5786;5811;5;"{abc1,abc2,abc3_4}";f;f
5786;"abc1";"abc";5782;5811;5799;5;"{abc_3_3,abc4,abc1}";f;f
5813;"abc3_4";"abc";5782;5811;5797;4;"{abc3_4,abc3,abc3_4}";t;f
5811;"abc_3_3";"abc";5782;5811;5797;4;"{abc_3_3,abc3,abc_3_3}";t;t
5799;"abc4";"abc";5782;5811;5797;4;"{abc3,abc4}";f;f

Hibernate 抛出异常

Caused by: com.vik.prod.service.UnidentifiedException: No Dialect mapping for JDBC type: 2003
at com.vik.prod.service.ServiceExecutorUtils.execute(ServiceExecutorUtils.java:93)
at com.vik.prod.service.ServerServiceExecutor.execute(ServerServiceExecutor.java:76)
at com.vik.prod.service.ClientDelegate.execute(ClientDelegate.java:197)
... 33 more

原因:org.hibernate.MappingException:没有 JDBC 类型的方言映射:2003

【问题讨论】:

  • 也许您应该考虑包含产生此问题的查询以及相关的数据类型?
  • 抱歉,由于机密问题,我无法提供查询。 hibernate 是否有 java.sql.Types.ARRAY 的映射。
  • 如果您无法显示真正的查询,请制作一个您可以显示的示例,或者至少提供对问题的体面描述。我猜对了,您的问题实际上应该是“如何在 Hibernate 中读取和写入像 text[] 这样的 PostgreSQL 数组?” .您尚未显示查询、错误消息、代码等。
  • 很抱歉,您的猜测是正确的,下面是查询格式

标签: hibernate postgresql


【解决方案1】:

Hibernate 不提供和 Converter 类/Mapper 类来转换 DB text[] 数据类型, 为此,我们可以编写自己的转换类型来实现UserType,或者我们使用 sqlQuery.addScalar("路径", Hibernate.TEXT);我们可以将 text[] 映射到文本,然后在 java 代码中我们可以将它从 ',' 中拆分出来

【讨论】:

  • 怎么样?将text[] 放在UserType 的哪个位置?可以举个例子吗?
  • 您也可以在 SQL 查询中进行强制转换以转换数组 e.g. select cast(text_array_col as text),然后对其进行解析
【解决方案2】:

使用包 'com.vladmihalcea:hibernate-types-52:2.8.0' 或将您的数据库方言添加到资源中的 yml 文件中:

@Entity
@TypeDefs({
        @TypeDef(name = "string-array", typeClass = StringArrayType.class),
        @TypeDef(name = "json", typeClass = JsonStringType.class),
        @TypeDef(name = "jsonb", typeClass = JsonBinaryType.class)
})
public class Post implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Type(type = "string-array")
    @Column(columnDefinition = "text[]")
    private String[] tags;

【讨论】:

  • 这有助于您明确指定类型定义,但我不确定如何在使用 session.createNativeQuery() 创建的临时查询中“激活”类型定义
  • @WouterLievens 我面临着与您描述的相同的挑战。我在 hibernate-types 项目中发现了一个integration test,表明它必须以某种方式成为可能。但我没有设法使它与@ColumnResult 中给出的类型一起工作,如String[].class。但是,对我来说,如果我将类型定义为StringArrayList.class,它就可以工作。但这不适用于二维数组。可能需要一些特定的设置。
【解决方案3】:

这就是我在 SpringBoot 中解决问题的方法:

  1. 添加对pom.xml的依赖:
        <dependency>
            <groupId>com.vladmihalcea</groupId>
            <artifactId>hibernate-types-52</artifactId>
            <version>2.11.1</version>
        </dependency>
  1. 如下扩展您的 Hybernate 方言:
import com.vladmihalcea.hibernate.type.array.StringArrayType;
import org.hibernate.dialect.PostgreSQL94Dialect;

public class PostgreSQL94CustomDialect extends PostgreSQL94Dialect {

    public PostgreSQL94CustomDialect() {
        super();
        this.registerHibernateType(2003, StringArrayType.class.getName());
    }

}
  1. application.properties 中指定PostgreSQL94CustomDialect
spring.jpa.properties.hibernate.dialect=com.package.name.PostgreSQL94CustomDialect

【讨论】:

  • 这里我们不需要 super() - 默认调用它
  • 是的!但是您可能有兴趣知道,这种模式可以在 hibernate 核心本身的许多地方找到,例如:herehere
【解决方案4】:

解决问题的一种可能性是使用“UNNEST”postgree 函数,这可以用作提示:

SELECT UNNEST({acl_3_3,acl3_4,acl3,acl_3_3})

【讨论】:

  • 运作良好...我不明白为什么,但这样做的伎俩!谢谢!
猜你喜欢
  • 2021-09-21
  • 2021-10-06
  • 1970-01-01
  • 2020-11-29
  • 2014-08-08
  • 2015-03-27
  • 2023-03-17
相关资源
最近更新 更多