首页 > 解决方案 > 如何通过 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;

标签: javamysqlhibernate

解决方案


为了数据库将使用默认值,期间不应指定该列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 是特定于供应商的。


推荐阅读