使Hibernate和SQL Server与VARCHAR和NVARCHAR配合使用

使Hibernate和SQL Server与VARCHAR和NVARCHAR配合使用,第1张

使Hibernate和SQL Server与VARCHAR和NVARCHAR配合使用

我决定尝试这种方法,使其在不接触数据库的情况下也 _可能_起作用。为此,我为NVARCHAR字段创建了自定义类型。这需要JDBC4驱动程序(使用Microsoft的驱动程序)和Hibernate3.6.0。sendStringParametersAsUnipre为false。

这是方法,我仍在验证它的正确性-来自经验超过我的人的任何评论都值得欢迎

添加新的方言以支持新的数据类型

public class SQLAddNVarCharDialect extends SQLServerDialect {    public SQLAddNVarCharDialect(){        super();        registerColumnType( Types.NVARCHAR, 8000, "nvarchar()" );  registerColumnType( Types.NVARCHAR,  "nvarchar(255)" );         }}

添加新的类型。注意

setNString
nullSafeSet

public class NStringUserType implements UserType  {    @Override    public Object assemble(Serializable arg0, Object owner) throws HibernateException {        return deepCopy(arg0);    }    @Override    public Object deepCopy(Object arg0) throws HibernateException {        if(arg0==null) return null;        return arg0.toString();    }    @Override    public Serializable disassemble(Object arg0) throws HibernateException {        return (Serializable)deepCopy(arg0);    }    @Override    public boolean equals(Object arg0, Object arg1) throws HibernateException {        if(arg0 == null ) return arg1 == null;        return arg0.equals(arg1);    }    @Override    public int hashCode(Object arg0) throws HibernateException {        return arg0.hashCode();    }    @Override    public boolean isMutable() {        return false;    }    @Override    public void nullSafeSet(PreparedStatement st, Object value, int index) throws HibernateException, SQLException {        if(value == null) st.setNull(index,Types.NVARCHAR);        else st.setNString(index, value.toString());    }    @Override    public Object replace(Object arg0, Object target, Object owner) throws HibernateException {        return deepCopy(arg0);    }    @Override    public Class returnedClass() {        return String.class;    }    @Override    public int[] sqlTypes() {        return new int[]{Types.NVARCHAR};    }    @Override    public Object nullSafeGet(ResultSet resultSet, String[] names, Object owner) throws HibernateException, SQLException {        String result = resultSet.getString(names[0]);        return result == null || result.trim().length() == 0  ? null : result;    }}

更新所有NVARCHAR字段的映射

    <property name="firstName" type="NStringUserType">        <column name="firstName" length="40" not-null="false" />    </property>

之前的原始SQL(带有sendUnipre .. = true):

 exec sp_prepexec @p1 output,N'@P0 nvarchar(4000),@P1 datetime,@P2 varchar(8000),@P3 nvarchar(4000),@P4 nvarchar(4000),@P5 nvarchar(4000),@P6 nvarchar(4000)... ,N'update Account set ... where AccountId=@P35

之后:

 exec sp_prepexec @p1 output,N'@P0 varchar(8000),@P1  .... @P6 nvarchar(4000),@P7 ... ,N'update Account set ... Validated=@P4, prefix=@P5, firstName=@P6 ... where AccountId=@P35

似乎对“ SELECT ..”工作类似。”



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/4956741.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-13
下一篇 2022-11-13

发表评论

登录后才能评论

评论列表(0条)

保存