【问题标题】:ERROR: column "publish_date" is of type date but expression is of type bytea错误:列“publish_date”的类型为 date,但表达式的类型为 bytea
【发布时间】:2023-03-15 16:26:01
【问题描述】:

我正在尝试将 Book 类型的对象插入数据库,其中一列被指定为日期,但根据此异常:

Caused by: org.postgresql.util.PSQLException: ERROR: column "publish_date" is of type date but expression is of type bytea
  Hint: You will need to rewrite or cast the expression.
  Position: 94
    at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2412)
    at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:2125)
    at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:297)
    at org.postgresql.jdbc.PgStatement.executeInternal(PgStatement.java:428)
    at org.postgresql.jdbc.PgStatement.execute(PgStatement.java:354)
    at org.postgresql.jdbc.PgPreparedStatement.executeWithFlags(PgPreparedStatement.java:169)
    at org.postgresql.jdbc.PgPreparedStatement.executeUpdate(PgPreparedStatement.java:136)
    at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:204)
    ... 11 more

被作为 bytea 放入。我不确定为什么会这样,因为在数据库中,列本身的类型是日期,而我的 Book 类中的列的类型是日期。我可以显示下面的代码:

package examples.pubhub.model;

import java.time.LocalDate;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name="books")
public class Book {

    @Id
    @Column(name="isbn_13")
    public String isbn_13;  // International Standard Book Number, unique

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

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

    @Column(name="publish_date")
    private LocalDate publish_date; // Date of publish to the website

    @Column(name="price")
    private double price;

    @Column(name="content")
    private byte[] content;

    // Constructor used when no date is specified
    public Book(String isbn, String title, String author, byte[] content, double price) {
        super();
        this.isbn_13 = isbn;
        this.title = title;
        this.author = author;
        this.publish_date = LocalDate.now();
        this.content = content;
        this.price = price;
    }

    // Constructor used when a date is specified
    public Book(String isbn, String title, String author, LocalDate publishDate, double price, byte[] content) {
        super();
        this.isbn_13 = isbn;
        this.title = title;
        this.author = author;
        this.publish_date = publishDate;
        this.content = content;
        this.price = price;
    }

    // Default constructor
    public Book() {

    }

    public String getIsbn_13() {
        return isbn_13;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public LocalDate getPublish_date() {
        return publish_date;
    }


    public void setPublish_date(LocalDate publishDate) {
        this.publish_date = publishDate;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    public byte[] getContent() {
        return content;
    }

    public void setContent(byte[] content) {
        this.content = content;
    }

    public void setIsbn_13(String isbn) {
        this.isbn_13 = isbn;

    }

}

这是我正在测试的离线课程:

package examples.pubhub.utilities;

import java.time.LocalDate;


import examples.pubhub.dao.BookDAO;
import examples.pubhub.dao.BooktagDAO;
import examples.pubhub.model.Book;
import examples.pubhub.model.Booktag;

public class PublishBookTest {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        String isbn = "1234123412341";
        String title = "Title";
        String author = "Haisam";
        String book_tag = "Science Fiction";


        BookDAO database = DAOUtilities.getBookDAO();
        Book tempBook = database.getBookByISBN(isbn);
        BooktagDAO tagdao = DAOUtilities.getBooktagDAO();
        Booktag tempBooktag = tagdao.getBookTagByISBN(isbn);

        if (tempBook != null && tempBooktag != null) {
            // ASSERT: book with isbn already exists

            System.out.println("ISBN already exists.");


        } else {

            Book book = new Book();
            Booktag booktag = new Booktag();
            book.setIsbn_13(isbn);
            book.setTitle(title);
            book.setAuthor(author);
            book.setPrice(124);
            book.setPublish_date(LocalDate.now());
            book.setContent(null);
            booktag.setBook_tag(book_tag);
            booktag.setBook_isbn(isbn);
            booktag.setBook_title(title);


            boolean isSuccess_booktag = tagdao.addTag(booktag);
            boolean isSuccess_book = database.addBook(book);



        if (isSuccess_book && isSuccess_booktag) {

            System.out.println("Added.");

        } else {

            System.out.println("Not added.");
        }


            }
        }

    }

如果有人知道如何从 bytea 转换为 date,或者这个问题的症结可能是什么,我将永远感激不尽。感谢您的宝贵时间。

TLDR:由于 LocalDate publish_date 与数据库中的实际列 publish_date 之间的类型不兼容,事务未提交,该列的类型为 date。不知道为什么。

【问题讨论】:

    标签: java hibernate type-conversion localdate bytea


    【解决方案1】:

    创建一个LocalDateToWhateverDBTypeConverterHere 是怎么回事。

    编辑

    有两个选项可以定义转换器的使用。第一个是在Converter类的@Converter注解处设置autoapply=true。在这种情况下,JPA 提供者将使用这个Converter 来转换给定类型的所有实体属性。 如果autoapply设置为false,则需要在所有需要转换的属性上添加javax.persistence.Convert注解并指定Converter类。以下代码 sn -p 显示了此方法的示例:

    @Entity
    public class RectangleEntity
    {
    
       @Id
       @GeneratedValue(strategy = GenerationType.IDENTITY)
       private Integer id;
    
       @Column
       private Integer x;
    
       @Column
       private Integer y;
    
       @Column
       @Convert(converter = ColorConverter.class)
       private Color color;
    
       ...
    }
    

    【讨论】:

    • 我是否可以简单地调用该类以在方法 book.setPublish_date() 中将 LocalDate 转换为 Date ?
    • 我可以阅读说明,先生。我在这个项目中没有使用spring,所以从外观上看,我需要寻找课堂上提到的罐子。我会尽力让它发挥作用。
    • 所以如果我理解正确的话,我会创建一个从 LocalDate 转换为 date 的类,然后在 book 的 publish_date 变量中,我像这样注释它吗?列转换 (converter = LocalDatetoDate.class) 假设 LocalDatetoDate 是类的名称?
    • 这些使用springframework jars,所以我需要添加它们。好的,我会努力完成这项工作。
    • 我最终使用了一个已经内置的方法 java.sql.Date.valueOf(LocalDate) 进行转换,现在它可以工作了。但你把我引向了它,所以我会认为这是一个可以接受的答案。
    猜你喜欢
    • 2015-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-19
    • 1970-01-01
    • 1970-01-01
    • 2018-03-31
    • 2020-06-08
    相关资源
    最近更新 更多