2

我使用 JPA (Hibernate) 和 jTDS 作为我的 jdbc 驱动程序。每当我的实体列的数据类型是字符串时,创建的准备好的语句varchar(8000)就用作其参数。例如,我已经尝试@Column(length=50)在我的映射中使用它,但它似乎被忽略了。

如果我sendStringParametersAsUnicode在 jTDS 连接中设置,它会nvarchar(4000)改为使用,但从不尊重我在实体中定义的长度。这有什么原因吗?

4

1 回答 1

1

我意识到这是一个老问题,但最近我自己遇到了这个问题,我想我会有所启发。

这似乎是jtds驱动程序故意的。

如果您查看TdsData.java,您将在此代码块中看到这种情况:

} else {
    if (pi.isUnicode && len <= MS_LONGVAR_MAX / 2) {
        pi.tdsType = XSYBNVARCHAR;
        pi.sqlType = "nvarchar(4000)";
    } else if (!pi.isUnicode && len <= MS_LONGVAR_MAX) {
        CharsetInfo csi = connection.getCharsetInfo();
        try {
            if (len > 0 && csi.isWideChars() &&
            pi.getBytes(csi.getCharset()).length > MS_LONGVAR_MAX) {
                pi.tdsType = SYBTEXT;
                pi.sqlType = "text";
            } else {
                pi.tdsType = XSYBVARCHAR;
                pi.sqlType = "varchar(8000)";
            }
于 2014-08-29T19:45:50.880 回答