我有這個休眠模型
package net.nebulacraft.nebulous.Data.Models;
import org.bukkit.command.CommandSender;
import javax.persistence.*;
import java.time.LocalDateTime;
import java.util.UUID;
@Entity
@Table(name = "warning")
public class Warning {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "warningid")
int WarningId;
@Column(name = "userid")
UUID Player;
@Column(name = "rulenumber")
int RuleNumber;
@Column(name = "expiration")
LocalDateTime Expiration;
@Column(name = "datecreated")
LocalDateTime DateCreated;
@Column(name = "warnedby")
UUID WarnedBy;
@Column(name = "message")
String Message;
public UUID getPlayer() {
return Player;
}
public void setPlayer(UUID player) {
Player = player;
}
public int getRuleNumber() {
return RuleNumber;
}
public void setRuleNumber(int ruleNumber) {
RuleNumber = ruleNumber;
}
public LocalDateTime getExpiration() {
return Expiration;
}
public void setExpiration(LocalDateTime expiration) {
Expiration = expiration;
}
public LocalDateTime getDateCreated() {
return DateCreated;
}
public void setDateCreated(LocalDateTime dateCreated) {
DateCreated = dateCreated;
}
public UUID getWarnedBy() {
return WarnedBy;
}
public void setWarnedBy(UUID warnedBy) {
WarnedBy = warnedBy;
}
public String getMessage() {
return Message;
}
public void setMessage(String message) {
Message = message;
}
public int getWarningId() {
return WarningId;
}
public void setWarningId(int warningId) {
WarningId = warningId;
}
}
我可以在資料庫中插入一個新的警告session.save(warning); session.getTransaction().commit();,警告是警告的一個實體,會話是一個休眠會話。但是,嘗試像這樣從資料庫中獲取警告實體
public static List<Warning> GetWarnings(UUID player) {
var session = DbFactory.getSessionFactory().openSession();
var builder = session.getCriteriaBuilder();
var query = builder.createQuery(Warning.class);
var root = query.from(Warning.class);
query.select(root);
query.where(
builder.and(
builder.equal(root.get("Player"), player),
builder.greaterThan(root.get("Expiration"), new Date())
)
);
query.orderBy(builder.desc(root.get("DateCreated")));
return session.createQuery(query).getResultList();
}
導致以下錯誤:
java.lang.ClassCastException: class java.util.Date cannot be cast to class java.time.LocalDateTime (java.util.Date and java.time.LocalDateTime are in module java.base of loader 'bootstrap')
Hibernate 在資料庫中插入一個 LocalDatetime 似乎沒有問題,為什么我不能從資料庫中取回一個?
在 postgre 中,Expiration 和 DateCreated 列都具有資料型別“沒有時區的時間戳”
uj5u.com熱心網友回復:
你說:
在 postgre 中,Expiration 和 DateCreated 列都具有資料型別“沒有時區的時間戳”
資料庫型別錯誤
您為資料庫列使用了錯誤的資料型別。
TIMESTAMP WITHOUT TIME ZONEPostgres 型別故意缺少任何時區或從 UTC 偏移的概念。所以這個型別不能用來代表一個時刻,不能是時間線上的一個特定點。
跟蹤時刻時,時間軸上的特定點,始終使用型別為 的列TIMESTAMP WITH TIME ZONE。
Java中的錯誤型別
同樣,您使用了錯誤的 Java 類。
該類LocalDateTime故意缺少任何時區或與 UTC 偏移的概念。所以這個型別不能用來代表一個時刻,不能是時間線上的一個特定點。
而是使用OffsetDateTime類從TIMESTAMP WITH TIME ZONE.
OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;
避免遺留的日期時間類
這兩個Date類現在都是遺留的,幾年前被JSR 310 中定義的現代java.time類所取代。
無需使用遺留類。它們的功能完全被java.time類所取代。
java.util.Date替換為java.time.Instant。java.sql.Date替換為java.time.LocalDate。
對于資料庫作業,請使用:
java.time.OffsetDateTime用于類似于 SQL 標準型別的型別的資料庫列TIMESTAMP WITH TIME ZONE。java.time.LocalDateTime用于類似于 SQL 標準型別的型別的資料庫列TIMESTAMP WITHOUT TIME ZONE。
JDBC 4.2 、Jakarta Persistence (JPA)和Hibernate都已更新為支持java.time。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/433410.html
上一篇:為什么我的物件陣列沒有正確制作?
