Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to return an Optional from MyBatis query

Is there any way to get MyBatis to return an Optional<MyClass> instance rather than simply a MyClass instance?

like image 220
GordyB Avatar asked Jan 02 '23 10:01

GordyB


1 Answers

Mybatis pre 3.5.0

Create custom ObjectFactory like this:

class OptionalAwareObjectFactory extends DefaultObjectFactory {

  public Object create(Class type, List<Class> constructorArgTypes, List<Object> constructorArgs) {
     if (Optional.class.isAssignableFrom(type)) {
        return Optional.fromNullable(Iterables.getOnlyElement(constructorArgs));
     } else {
        return super.create(type, constructorArgTypes, constructorArgs);
     }
  }
}

And configure it to be used in mybatis.xml:

 <objectFactory type="my.company.project.OptionalAwareObjectFactory"/>

Mybatis 3.5.0+

Since 3.5.0 Optional is supported natively as fankai pointed out.

like image 96
Roman Konoval Avatar answered Jan 12 '23 00:01

Roman Konoval