我正在使用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一起使用,那就太好了。