java - 如何通过 Hibernate 合并为字段设置默认 NULL 值
问题描述
@Entity
@Table(name = "account")
public class PrepaidAccount implements Account, Serializable {
protected Integer pre_notif_interval;
public Integer getPreNotifInterval() {
return pre_notif_interval;
}
public void setPreNotifInterval(Integer pre_notif_interval) {
this.pre_notif_interval = pre_notif_interval;
}
我需要设置 NULL(该字段的默认值)。
我该怎么做?
从我调用的服务中,我有一些整数值设置工作正常 -
account.setPreNotifInterval(2);
em.persist(account);
数据库架构是 -
`pre_notif_interval` tinyint(1) DEFAULT NULL;
解决方案
为了数据库将使用默认值,期间不应指定该列INSERT
(或应使用特殊DEFAULT
关键字)。不幸的是,JPA 不支持这两种方法。所以应该发送一个原生 SQL,这可以使用FluentJPA完成:
default PrepaidAccount insertWithDefaults(String required1,
int required2) {
FluentQuery query = FluentJPA.SQL((PrepaidAccount p) -> {
INSERT().INTO(viewOf(p, PrepaidAccount ::getRequired1, Person::getRequired2));
VALUES(row(required1, required2));
// RETURNING(p); //PostgreSQL
// Person inserted = INSERTED(); //SQL Server
// OUTPUT(inserted);
});
// works in MySQL, H2
int nOfUpdated = query.createQuery(getEntityManager()).executeUpdate();
if (nOfUpdated <= 0)
return null;
query = FluentJPA.SQL((PrepaidAccount p) -> {
SELECT(p);
FROM(p);
WHERE(p.getId() == LAST_INSERT_ID());
});
PrepaidAccount prepaid = query.createQuery(getEntityManager(), PrepaidAccount.class)
.getSingleResult();
return prepaid;
}
请注意,返回插入的行或 ID 是特定于供应商的。
推荐阅读
- javascript - React 应用程序未在 IE 11 中显示 - 在 Chrome 中很好
- swift - UICollectionView 标题视图类似于表视图标题(不是节标题)
- asp.net - 如何使用引导程序使 ASP gridview 响应
- vb.net - 轮换名单(Of T)
- vb.net - VB.NET - 从表单类型和表单的新实例调用 .Show() 的根本区别?
- docker - 使用 Docker 时如何在本地缓存 Rust crates?
- pic - 程序 - 用于 pic18f65k40 的 UART 通信
- azure-container-service - 将 AKS 从 1 个节点扩展到 2 个节点:无法在 Node0 上创建 pod 并在 Node1 上执行(或查看日志)
- javascript - 使用 bodybuilder.js 将点符号 JSON 转换为弹性搜索深度嵌套查询 JSON?
- c# - 在 asp.net mvc 应用程序中重新启动应用程序时删除的数据