繁体   English   中英

JOOq稀疏更新

[英]JOOq sparse update

我正在使用Jax-RS和Jooq。 我想知道如何使用稀疏数据实现REST PATCH。

假设我有一些PoJo。 我收到一个JSON PATCH( http://www.restapitutorial.com/lessons/httpmethods.html )请求,该请求带有不完整的对象,该对象仅包含应该更改的字段。

我将如何编写这样的处理程序?

我尝试接受实际的Pojo对象。 我的第一个想法是“如果一个字段为空,我不更新它”。 这是我的第一个问题。

public Resource update(@PathParam("id") UUID id, Resource resource) {
    ResourceRecord record = dslContext.newRecord(RESOURCE, resource);
    dslContext.update(RESOURCE).set(resource).where(RESOURCE.ID.eq(id)).execute();

    // or

    memberDao.update(member);

    return resourceDao.findById(id);
}

在尝试和在线搜索时,我想到了“故意将某些内容设置为null呢?”。 因此,它必须取决于请求中字段的存在。

我的最后一个想法是:

public Resource update(@PathParam("id") UUID id, Map<String, Object> changes) {
    dslContext.update(RESOURCE).set(changes).where(RESOURCE.ID.eq(id)).execute();
    return resourceDao.findById(id);
}

这当然不起作用(set(Map <Field,...>))。

但是我有点卡住了,interwebz充满了针对不同问题的答案,但是我没有发现有人尝试过相同的事情。

在我的脑海中,我在玩反射和循环,感觉真棒。 我想知道如何尽可能轻松地编写该代码。

我尝试接受实际的Pojo对象。 我的第一个想法是“如果一个字段为空,我不更新它”。 这是我的第一个问题。

这不是jOOQ的工作方式。 基本原理在此博客文章中进行了描述 特别是,您在此处的特定代码行:

ResourceRecord record = dslContext.newRecord(RESOURCE, resource);

将所有ResourceRecord.changed()标志设置为true ,无论它们是否为null (因此,无论它们的值是否已通过从POJO进行设置而被修改)。 在REST方面,这对应于PUT ,远远超过PATCH

这样更好:

public Resource update(@PathParam("id") UUID id, Map<String, Object> changes) {
    dslContext.update(RESOURCE)
              .set(translate(RESOURCE, changes))
              .where(RESOURCE.ID.eq(id))
              .execute();
    return resourceDao.findById(id);
}

您将需要一个translate()函数,将您的Map<String, Object>转换为Map<Field<?>, Object> ,并在RESOURCE查找字段名称。

这应该可以立即使用,当然,当前与其余API不一致。 正在进行修复: https : //github.com/jOOQ/jOOQ/issues/6388

同时,您只需将映射传递到DSLContext.newRecord(Table, Object) ,它将在内部调用Record.fromMap()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM