当前位置: 首页 > 知识库问答 >
问题:

使用JOOQ将POJO中的字段设置为null

扶高歌
2023-03-14
// Load the customer record from a POJO
CustomerRecord customer = ctx.newRecord(CUSTOMER, customerPojo);
customer.update();

// Expected behavior: null fields in customerPojo will set db values to null
// Actual behavior: null fields in customerPojo do not change values in db
drop table if exists customers;
create table customers
(
    id         serial not null primary key,
    first_name text,
    last_name  text
);
java prettyprint-override">@Data
@Builder(toBuilder = true)
@NoArgsConstructor
@AllArgsConstructor
public class Customer {

    private Integer id;
    private String firstName;
    private String lastName;

    public static Customers TAB = Customers.CUSTOMERS;
    static DSLContext ctx = PostgresSingleton.getMainCtx();

    public Customer store(){
        CustomersRecord rec = ctx.newRecord(TAB, this);
        if(getId() == null) {
            rec.store();
        }
        else {
            rec.update();
        }
        rec.refresh();
        return rec.into(Customer.class);
    }
}
    def "Customer test"() {
        when: "save a new customer"
        Customer cust = Customer.builder().firstName("Phil").lastName("H").build().store()

        then: "ID populated"
        def custId = cust.getId()
        custId != null

        when: "null out last name"
        cust.toBuilder().lastName(null).build().store()

        then: "last name actually set to null"
        cust.getId() == custId
        cust.getFirstName() == "Phil"
        cust.getLastName() == null //fails, still is "H"
    }

编辑2:

似乎.update()调用实际上是在取消数据库中的字段!但是,.into()调用并没有像预期的那样用空字段刷新POJO。我在.refresh()之后验证了lastName的为null,但是into()调用没有使该值为null。

共有1个答案

苏健柏
2023-03-14

嗯,这是一个PEBKAC错误--我没有将更新的结果存储回测试中的同一个对象中:

        when: "null out last name"
        cust.toBuilder().lastName(null).build().store() //not storing the result!

应该是:

        when: "null out last name"
        cust = cust.toBuilder().lastName(null).build().store()

容易错过。

 类似资料:
  • 我想使用POJO作为源来更新JOOQ记录中更改的字段<代码>记录。from(Object)几乎正确,但根据文档 结果记录的所有值的内部“更改”标志都将设置为true。 我只希望实际更改的字段(由对象决定。等于(对象,对象))更新其标志。 这有两个原因: 我不想触发插入

  • 我正在将jOOQ结果映射到POJO。 我希望避免由于字段名和列名之间的输入错误/不匹配而导致结果的列没有被映射。 有没有办法配置jOOQ来验证POJO的每个字段是否设置正确?

  • 问题内容: 我有以下结构,并且需要某些字段为空,所以我使用指针,主要是处理sql空值 所以当我执行以下操作时,我可以看到json结果中的值类型可以为null 但是当我尝试使用反射完成所有操作时 我从反射部分得到的是以下错误 我究竟做错了什么? 这是一个GoPlay http://play.golang.org/p/0xt45uHoUn 问题答案: Reflection.Value.Set仅接受作为

  • 我已经看到,当我们使用或时,JOOQ可以自动返回POJO 但是有可能将复杂查询的结果转换成多个POJO吗? 我测试了方法,它工作得很好。但我没有支持对象。

  • 问题内容: 我在一个对象上调用user.save(),在其中设置user.signup_date = null; 但是当我在mongodb中查看用户时,仍然设置了signup_date和first_name …如何有效地将此字段设置为空或null? 问题答案: 要从现有文档中删除这些属性,请将其设置为,而不是在保存文档之前: 确认仍可在Mongoose 5.9.7中使用。请注意,您仍要在架构中定义

  • 在我的Oracle数据库中,我有存储为VARCHAR的数量值。从数据库中检索记录时,我希望将它们映射到一个POJO,其中金额值表示为double。不幸的是,我不能使用强制类型,因为在数据库中,所有内容都存储为VARCHAR,并且没有模式将列标识为包含金额值的列。 我正在查看jOOQ转换器,这似乎是我想要的。因此,我为此创建了一个jOOQ转换器: 然而,每当我想使用将数据库记录映射到我的POJO时,