long 类型的错误值:- Postgresql、Hibernate、Spring

Posted

技术标签:

【中文标题】long 类型的错误值:- Postgresql、Hibernate、Spring【英文标题】:bad value for type long: - Postgresql, Hibernate, Spring 【发布时间】:2012-09-20 19:05:58 【问题描述】:

我想使用 Spring MVC 和 Hibernate 在 PostgresQL 中存储一个实体(一个字符串 + 一个图像) 这是我的桌子。图片应该是oid的类型。

CREATE TABLE document
(
  name character varying(200),
  id serial NOT NULL,
  content oid,   // that should be the image
  CONSTRAINT document_pkey PRIMARY KEY (id )
)
WITH (
  OIDS=FALSE
);

这是我要存储的实体。

    @Entity
    @Table(name = "document")
    public class Document 

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

        @Column(name = "name")
        private String name;

        @Column(name="content")
            private Blob content;  //this is the image
//getters- setters

你可以看到变量“name”是一个String,而不是Long。仍然当我提交带有非数字值的表单时,它会抛出 org.postgresql.util.PSQLException: Bad value for type long : x

这里是表格:

<form:form method="post" action="save.html" commandName="document" enctype="multipart/form-data">
    <form:errors path="*" cssClass="error"/>
    <table>
    <tr>
        <td><form:label path="name">Name</form:label></td>
        <td><form:input path="name" /></td> 
    </tr>

     <tr>
        <td><form:label path="content">Document</form:label></td>
        <td><input type="file" name="file" id="file"></input></td>
    </tr>
    <tr>
        <td colspan="2">
            <input type="submit" value="Add Document"/>
        </td>
    </tr>
</table>  
</form:form>

如果我输入一个数值并提交,OK。但是任何非数字值都会触发上述异常......我读到这可能是由于我没有正确使用 OID 造成的,但我不知道应该怎么做才能消除这个异常。其实我也不明白 excpetion 的名字。它说“类型 long 的价值不高”。但是谁想要长字呢? 变量“name”是字符串类型!!!

最后是控制器

@RequestMapping(value = "/save", method = RequestMethod.POST)
public String save(@ModelAttribute("document") Document document, @RequestParam("file") MultipartFile file) 

    try 
        Blob blob = Hibernate.createBlob(file.getInputStream());
        document.setContent(blob);
        documentDao.save(document);
     catch (Exception e) 
        e.printStackTrace();
    


    return "redirect:/index.html";

任何建议都会被采纳。

【问题讨论】:

您可能想尝试使用 hibernate @Lob 注释来注释您的 Blob 声明。此外,打开 hibernate 的查询输出可能会有所帮助,这样您就可以看到正在生成的 sql 并查看它是否会提示您发送到数据库的内容。 OID 不能保存 BLOB。 "The oid type is currently implemented as an unsigned four-byte integer."。我想这就是错误的来源。 @madth3 oid 用于保存对pg_largeobject 表中的大对象的引用。 当然,很抱歉。你检查this question了吗?您使用的是哪个版本的 PostgreSQL? 您使用的是哪个版本的 PostgreSQL? PostgreSQL 9.1 【参考方案1】:

我有一个类似的问题,但它与数据库中 ID 字段的顺序无关。

经过一番搜索,我发现 this 指出除非另有说明,否则 Hibernate 中的 Lobs 被视为 OID。

这意味着 Hibernate 将尝试将 Lob 放入 Long a 中,因此产生异常 PSQLException: Bad value for type long

指定将 Lob 视为文本的方法是通过注释字段

@Lob
@Type(type = "org.hibernate.type.TextType")

【讨论】:

你也可以使用@Column(columnDefinition = "text")而不是lob+type。 使用columnDefinition 对我不起作用。但是使用@Type 确实如此。 我确认了 Hibernate 3.6.8 和 PostgreSQL 9.4 的问题。应用 Tšeliso Molukanele 的解决方案后效果很好。 它拯救了我的一天!我得到的错误的奇怪之处在于日志中指向的字段不是 TEXT 字段。【参考方案2】:

当我创建表时,“名称”列恰好是第一个。这不好。 Id 必须是第一列。如果我改变列的顺序,它工作正常......

【讨论】:

@Regenbogenfisch - 如何更改顺序或列?我也面临这个问题。我已经在 pgAdmin III 中尝试过,但不能,你能帮帮我吗? 只需删除表并重新创建它。【参考方案3】:

一开始我尝试设置

@Column(columnDefinition = "text")

而不是 @Lob 注释,正如这里已经提到的。它在 PostgreSQL 上对我有用,但有错误 org.hibernate.tool.schema.spi.SchemaManagementException:架构验证:在表 [问题] 的列 [htmlText] 中遇到错误的列类型;找到 [clob (Types#CLOB)],但期待 [text (Types#VARCHAR)]

在我的单元测试中(在 HSQLDB 上)。

然后试了

@Column(columnDefinition = "clob")

它在 PostgreSQL 和 HSQLDB 上都运行良好!

【讨论】:

【参考方案4】:

Postgres 和 Hibernate 存在问题。列 text 无法映射到字符串。 您需要添加:@Type(type="org.hibernate.type.TextType")

例子:

@Lob
@Type(type = "org.hibernate.type.TextType")
@Column
private String contentJson;

如果列包含二进制类型,请使用: @Type(type="org.hibernate.type.BinaryType")

基于页面的解决方案:https://github.com/jhipster/generator-jhipster/issues/5995

【讨论】:

【参考方案5】:

我遇到了微笑错误,原因是我在整数数据类型字段中包含除整数以外的一些字符

例如- ,111 和 144- 等

【讨论】:

以上是关于long 类型的错误值:- Postgresql、Hibernate、Spring的主要内容,如果未能解决你的问题,请参考以下文章

Postgresql,BigDecimal 类型的错误值:NaN

Grails 和 Quartz:long 类型的错误值

如何修复错误:无法将类型“java.lang.String”的值转换为所需类型“java.lang.Long”;

出现错误:无法反序列化对象。无法将 java.lang.String 类型的值转换为 long

关于blob转到目标库报ORA-01461: 仅能绑定要插入 LONG 列的 LONG 值错误解决方案

引起:org.postgresql.util.PSQLException:错误:列“imagesync__c”的类型为布尔值,但表达式的类型为字符变化