有没有一种简单的方法可以将Java不可变对象与查询中的可选字段绑定在一起?

时间:2019-02-06 22:59:18

标签: java binding optional dao

我正在使用DAO插入一个带有Optional字段的不可变对象,并希望使用@BindBean批注将对象绑定到查询参数。由于Optional字段,此方法不起作用。

我试图解决此问题的方法是制作一个自定义的活页夹,但我觉得必须有一种更可维护的方法。

这是我创建DAO语句的方式:

@GetGeneratedKeys
@SqlUpdate("INSERT INTO TASKS (project_id, creator_id, stage, title, description, created_at, priority, est_work)" +
           "VALUES (:projectId, :creatorId, :stage, :title, :description, :createdAt, :priority, :estimatedWork)")
int insertTask(@NewTaskBinder ImmutableNewTask newTask);

这是我当前的解决方案:

@BindingAnnotation(NewTaskBinder.NewTaskBinderFactory.class)
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.PARAMETER)
public @interface NewTaskBinder {
    class NewTaskBinderFactory implements BinderFactory {

        @Override
        public Binder build(Annotation t) {
            return (Binder<NewTaskBinder, ImmutableNewTask>) (query, bind, newTask) -> {
                query.bind("title", newTask.getTitle());
                query.bind("stage", newTask.getStage());
                query.bind("creatorId", newTask.getCreatorId());
                query.bind("projectId", newTask.getProjectId());
                query.bind("createdAt", new Date());
                query.bind("dueDate", newTask.getDueDate().orElse(null));
                query.bind("priority", newTask.getPriority().orElse(null));
                query.bind("description", newTask.getDescription().orElse(null));
                query.bind("estimatedWork", newTask.getEstimatedWork().orElse(null));
            };
        }
    }
}

@BindBean在没有Optional字段的情况下效果很好。如果有一种方法可以调整此选项以使其与Optionals一起使用,那就太好了。

0 个答案:

没有答案