gpt4 book ai didi

java - 错误: column "publish_date" is of type date but expression is of type bytea

转载 作者:太空宇宙 更新时间:2023-11-04 11:19:49 24 4
gpt4 key购买 nike

我正在尝试将 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;

}

}

这是我正在测试的离线类(class):

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:由于 LocalDatepublish_date 和数据库中的实际列publish_date(日期类型)之间的类型不兼容,因此事务未提交。不知道为什么。

最佳答案

创建一个LocalDateToWhateverDBTypeConverterHere是怎样的。

编辑:

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

@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;

...
}

关于java - 错误: column "publish_date" is of type date but expression is of type bytea,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45046855/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com