rea*_*yn3 6 postgresql enums hibernate hibernate-criteria
我在使用 hibernate 从 java 实体中的枚举更新 postgres 数据库中的枚举字段时遇到问题,导致标题中出现错误。
我的数据库看起来像这样
\dT fulfillment_status
List of data types
Schema | Name | Description
--------+--------------------+-------------
public | fulfillment_status |
(1 row)
Run Code Online (Sandbox Code Playgroud)
这设置特定列fulfillment_status的类型,即
Column | Type | Collation | Nullable | Default
----------------------------+--------------------------------+-----------+----------+--------------------------------------
fulfillment_status | fulfillment_status | | not null |
Run Code Online (Sandbox Code Playgroud)
java实体类的相关章节
@Entity
@Table(name = "payments", uniqueConstraints = { @UniqueConstraint(columnNames = {"id"})})
public class Payment {
private FulfillmentStatus fulfillmentStatus;
public enum FulfillmentStatus {
PENDING, FULFILLED, FAILED, ABORTED
}
@Enumerated(EnumType.STRING)
@Column(name = "fulfillment_status", nullable = false, columnDefinition = "enum('PENDING', 'FULFILLED', 'FAILED', 'ABORTED')")
public FulfillmentStatus getFulfillmentStatus() {
return fulfillmentStatus;
}
public void setFulfillmentStatus(FulfillmentStatus fulfillmentStatus) {
this.fulfillmentStatus = fulfillmentStatus;
}
Run Code Online (Sandbox Code Playgroud)
以及用于更新类的代码
Session session = sessionFactory.getCurrentSession();
session.beginTransaction();
CriteriaBuilder builder = session.getCriteriaBuilder();
CriteriaUpdate<Payment> update =
builder.createCriteriaUpdate(Payment.class);
Root root = update.from(Payment.class);
update.set(root.get("fulfillmentStatus"),
Payment.FulfillmentStatus.FULFILLED);
update.where(builder.equal(root.get("requestID"), UUID.fromString(requestID)));
session.createQuery(update).executeUpdate();
session.getTransaction().commit();
session.close();
Run Code Online (Sandbox Code Playgroud)
这会产生错误
Hibernate:
update
payments
set
fulfillment_status=?
2018-05-02 08:54:11 WARN SqlExceptionHelper:129 - SQL Error: 0, SQLState: 42804
2018-05-02 08:54:11 ERROR SqlExceptionHelper:131 - ERROR: column "fulfillment_status" is of type fulfillment_status but expression is of type character varying
Hint: You will need to rewrite or cast the expression.
Position: 40
Run Code Online (Sandbox Code Playgroud)
这里的问题似乎是如何使用 CriteriaUpdate 将 java 枚举类型映射到 postgres 枚举类型......希望不需要创建额外的映射类。
这解决了我的问题:
@Column(name = "fulfillment_status")
@ColumnTransformer(write="?::fulfillment_status")
public FulfillmentStatus getFulfillmentStatus() {
return fulfillmentStatus;
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
3075 次 |
最近记录: |