当前位置: 首页 > 知识库问答 >
问题:

如何修复Hibernate org.Hibernate.mappingException:JDBC类型:2003没有方言映射

呼延凌
2023-03-14
public void GetLevel(int id) 
    {
        Type doubleArrayType=new TypeLocatorImpl(new TypeResolver())
                .custom(DoubleArrayUserType.class);
        Query query =  sf.getCurrentSession().
                createSQLQuery("select waterLevel from FtpData").
                addScalar("waterLevel", doubleArrayType);


        @SuppressWarnings("unchecked")
        List<Double[]> results=(List<Double[]>) query.list();
        System.out.println("In dao layer data:"+results);
        return;
    }
package com.app.usertype;

import org.apache.commons.lang3.ArrayUtils;
import org.hibernate.HibernateException;
import org.hibernate.engine.spi.SessionImplementor;
import org.hibernate.usertype.UserType;

import java.io.Serializable;
import java.sql.*;

public class DoubleArrayUserType implements UserType {
    protected static final int  SQLTYPE = java.sql.Types.ARRAY;

    @Override
    public Object nullSafeGet(final ResultSet rs, final String[] names, final SessionImplementor sessionImplementor, final Object owner) throws HibernateException, SQLException {
        Array array = rs.getArray(names[0]);
        Double[] javaArray = (Double[]) array.getArray();
        return ArrayUtils.toPrimitive(javaArray);
    }

    @Override
    public void nullSafeSet(final PreparedStatement statement, final Object object, final int i, final SessionImplementor sessionImplementor) throws HibernateException, SQLException {
        Connection connection = statement.getConnection();

        double[] castObject = (double[]) object;
        Double[] doubles = ArrayUtils.toObject(castObject);
        Array array = connection.createArrayOf("DOUBLE", doubles);

        statement.setArray(i, array);
    }

    @Override
    public Object assemble(final Serializable cached, final Object owner) throws HibernateException {
        return cached;
    }

    @Override
    public Object deepCopy(final Object o) throws HibernateException {
        return o == null ? null : ((double[]) o).clone();
    }

    @Override
    public Serializable disassemble(final Object o) throws HibernateException {
        return (Serializable) o;
    }

    @Override
    public boolean equals(final Object x, final Object y) throws HibernateException {
        return x == null ? y == null : x.equals(y);
    }

    @Override
    public int hashCode(final Object o) throws HibernateException {
        return o == null ? 0 : o.hashCode();
    }

    @Override
    public boolean isMutable() {
        return false;
    }

    @Override
    public Object replace(final Object original, final Object target, final Object owner) throws HibernateException {
        return original;
    }

    @Override
    public Class<double[]> returnedClass() {
        return double[].class;
    }

    @Override
    public int[] sqlTypes() {
        return new int[] { SQLTYPE };
    }
}

下面是ma hibernate-persistent.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
    xmlns:p="http://www.springframework.org/schema/p" xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd">

    <!-- supply loc -->
    <context:property-placeholder 
    location="classpath:/database.properties" />
    <!-- DS bean -->
    <bean id="dataSource" 
    class="org.apache.commons.dbcp.BasicDataSource"
        p:driverClassName="${jdbc.driver}" p:url="${jdbc.url}" 
        p:username="${jdbc.username}"
        p:password="${jdbc.password}" 
        p:initialSize="1" p:maxActive="2"
        destroy-method="close">
    </bean>
    <!-- configure Hibernate 4 specific local session factory bean -->
    <bean id="sessionFactory"
        class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"
        p:packagesToScan="com.app.dto" p:dataSource-ref="dataSource">
        <property name="hibernateProperties">
            <value>
                hibernate.dialect= org.hibernate.dialect.PostgreSQLDialect
                hibernate.format_sql=true
                hibernate.show_sql=true
                hibernate.hbm2ddl.auto=validate

            </value>

        </property>
            </bean>
    <!-- configure tx mgr bean -->

    <bean id="transactionManager"
        class="org.springframework.orm.hibernate4.HibernateTransactionManager"
        p:sessionFactory-ref="sessionFactory">
    </bean> <!-- enable tx annotation suuport -->
    <tx:annotation-driven />

</beans>

属性

jdbc.driver=org.postgresql.Driver
jdbc.url=jdbc:postgresql://127.0.0.1:5433/glofdata
jdbc.username=postgres
jdbc.password=postgres
jdbc.dialect=org.hibernate.dialect.PostgreSQLDialect

共有1个答案

潘弘壮
2023-03-14

Hibernate不支持数据库数组(例如java.sql.array)

Hibernate提供的arrayprimity-array类型用于将Java数组映射到支持表-它们基本上是一对多/元素集合映射的变体。

这里是Postgresql的一个示例,其中@Alex自己使用UserType for integer Arrays解决了这个问题。另外,这个示例与用Hibernate映射postgres数组有关。
希望这能有所帮助。

 类似资料:
  • 问题内容: 尽管此标题存在一些问题,但我的查询并没有从那些线程中解决。 我正在通过postgres中的hibernate执行递归查询(与子句一起使用),查询结果也包含搜索路径 例如:查询结果的一行 hibernate状态是否具有String以外的任何映射类型,类似于或。 下面是查询输出的示例 Hibernate抛出异常 原因:org.hibernate.MappingException:没有JDB

  • 虽然这个标题存在一些问题,但我的查询无法从这些线程中解决。 我在postgres中通过hibernate执行递归(使用with子句)查询,查询结果也包含搜索路径 ex:一行查询结果 Hibernate是否具有除字符串以外的的任何映射类型,类似于或。 下面是查询输出的示例 Hibernate正在抛出异常 原因:org.hibernate.MappingException:没有JDBC类型的方言映射:

  • 我正在开发一个Spring JPA应用程序,使用MySQL作为数据库。我确保加载了所有spring-jpa库、hibernate和mysql-connector-java。 期待您的回答,谢谢! 顺便说一句,应用程序已经在使用spring Boot了。

  • 问题内容: 我正在使用MySQL作为数据库的Spring JPA应用程序。我确保已加载所有spring-jpa库,hibernate和mysql-connector- java。 我正在运行mysql 5实例。这是我的application.properties文件的摘录: 执行集成测试时,spring可以正常启动,但无法创建hibernate的SessionFactory,但以下情况除外: 我认

  • 问题内容: 我正在尝试遵循Hibernate Spatial教程,通过Hibernate将Spring Roo与启用PostGIS的PostgreSQL数据库集成。所有非GIS的东西都可以正常工作,并且我已经从PostGIS模板创建了一个数据库。 问题是,一旦我向其中一个实体添加了Geometry属性,就可以: …构建良好,但是尝试在服务器上运行(并实际上与DB交互)会导致以下错误: Hibern

  • 我得到以下错误 JDBC 类型的无方言映射:2003 年;嵌套的异常是组织Hibernate映射异常:JDBC 类型没有方言映射:2 回购代码如下 DTO 对象如下所示 我们使用 Postgres DB,实际上在获取 值时存在一些问题。 Stackoverflow中的其他答案是特定于Hibernate的。但我们使用。