title: org.springframework.dao.InvalidDataAccessApiUsageException: Parameter value did not match expected type java.time.LocalDateTime
body: <p>I just started to take care of a code developed by other person. It was designed based on Specification pattern using Spring Data and Hibernate.</p>
  
  <p>In few words, if I try search using string, boolean or integer fields it works correctly. For instance, when I search/filter with state==SP I got the result and I can see that the diatomite fields are correctly filled in. Also I see hibernate no complaining about invalid data in this case:</p>
  
  <p>Copied form my console when I searched succesfully with "state==SP"
      ...
      TRACE 2450 --- [nio-9000-exec-2] o.h.type.descriptor.sql.BasicExtractor   : extracted value ([created17_12_] : [TIMESTAMP]) - [2013-07-12T06:53:47]
      ... </p>
  
  <p><a href="https://i.stack.imgur.com/68cDy.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/68cDy.png" alt="enter image description here"></a></p>
  
  <p>Nevertheless, when I search/filter with datetime I get the error summarised in this question. For instance: I search "createdDate==2014-06-03T18:48:33" and I get:</p>
  
  <pre><code>2018-03-23 17:38:17.547 ERROR 2450 --- [nio-9000-exec-5] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.dao.InvalidDataAccessApiUsageException: Parameter value [2014-06-03T18:48:33] did not match expected type [java.time.LocalDateTime (n/a)]; nested exception is java.lang.IllegalArgumentException: Parameter value [2014-06-03T18:48:33] did not match expected type [java.time.LocalDateTime (n/a)]] with root cause
  
  java.lang.IllegalArgumentException: Parameter value [2014-06-03T18:48:33] did not match expected type [java.time.LocalDateTime (n/a)]
      at org.hibernate.jpa.spi.BaseQueryImpl.validateBinding(BaseQueryImpl.java:897) ~[hibernate-entitymanager-5.0.12.Final.jar:5.0.12.Final]
      at org.hibernate.jpa.internal.QueryImpl.access$000(QueryImpl.java:61) ~[hibernate-entitymanager-5.0.12.Final.jar:5.0.12.Final]
      at org.hibernate.jpa.internal.QueryImpl$ParameterRegistrationImpl.bindValue(QueryImpl.java:235) ~[hibernate-entitymanager-5.0.12.Final.jar:5.0.12.Final]
      at org.hibernate.jpa.spi.BaseQueryImpl.setParameter(BaseQueryImpl.java:638) ~[hibernate-entitymanager-5.0.12.Final.jar:5.0.12.Final]
      at org.hibernate.jpa.spi.AbstractQueryImpl.setParameter(AbstractQueryImpl.java:163) ~[hibernate-entitymanager-5.0.12.Final.jar:5.0.12.Final]
      at org.hibernate.jpa.spi.AbstractQueryImpl.setParameter(AbstractQueryImpl.java:32) ~[hibernate-entitymanager-5.0.12.Final.jar:5.0.12.Final]
      at org.hibernate.jpa.criteria.compile.CriteriaCompiler$1$1.bind(CriteriaCompiler.java:109) ~[hibernate-entitymanager-5.0.12.Final.jar:5.0.12.Final]
      at org.hibernate.jpa.criteria.CriteriaQueryImpl$1.buildCompiledQuery(CriteriaQueryImpl.java:366) ~[hibernate-entitymanager-5.0.12.Final.jar:5.0.12.Final]
      at org.hibernate.jpa.criteria.compile.CriteriaCompiler.compile(CriteriaCompiler.java:130) ~[hibernate-entitymanager-5.0.12.Final.jar:5.0.12.Final]
      at org.hibernate.jpa.spi.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:699) ~[hibernate-entitymanager-5.0.12.Final.jar:5.0.12.Final]
      at sun.reflect.GeneratedMethodAccessor93.invoke(Unknown Source) ~[na:na]
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_162]
      at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_162]
      at org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:347) ~[spring-orm-4.3.10.RELEASE.jar:4.3.10.RELEASE]
      at com.sun.proxy.$Proxy115.createQuery(Unknown Source) ~[na:na]
      at sun.reflect.GeneratedMethodAccessor93.invoke(Unknown Source) ~[na:na]
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_162]
      at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_162]
      at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:298) ~[spring-orm-4.3.10.RELEASE.jar:4.3.10.RELEASE]
      at com.sun.proxy.$Proxy115.createQuery(Unknown Source) ~[na:na]
      at org.springframework.data.jpa.repository.support.SimpleJpaRepository.getQuery(SimpleJpaRepository.java:656) ~[spring-data-jpa-1.11.6.RELEASE.jar:na]
      at org.springframework.data.jpa.repository.support.SimpleJpaRepository.getQuery(SimpleJpaRepository.java:608) ~[spring-data-jpa-1.11.6.RELEASE.jar:na]
      at org.springframework.data.jpa.repository.support.SimpleJpaRepository.findAll(SimpleJpaRepository.java:407) ~[spring-data-jpa-1.11.6.RELEASE.jar:na]
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_162]
      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_162]
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_162]
      at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_162]
      at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.executeMethodOn(RepositoryFactorySupport.java:504) ~[spring-data-commons-1.13.6.RELEASE.jar:na]
      at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.doInvoke(RepositoryFactorySupport.java:489) ~[spring-data-commons-1.13.6.RELEASE.jar:na]
      at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:461) ~[spring-data-commons-1.13.6.RELEASE.jar:na]
      at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) ~[spring-aop-4.3.10.RELEASE.jar:4.3.10.RELEASE]
      at org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:56) ~[spring-data-commons-1.13.6.RELEASE.jar:na]
      at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) ~[spring-aop-4.3.10.RELEASE.jar:4.3.10.RELEASE]
      at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:133) ~[spring-data-jpa-1.11.6.RELEASE.jar:na]
      at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) ~[spring-aop-4.3.10.RELEASE.jar:4.3.10.RELEASE]
      at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92) ~[spring-aop-4.3.10.RELEASE.jar:4.3.10.RELEASE]
      at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) ~[spring-aop-4.3.10.RELEASE.jar:4.3.10.RELEASE]
      at org.springframework.data.repository.core.support.SurroundingTransactionDetectorMethodInterceptor.invoke(SurroundingTransactionDetectorMethodInterceptor.java:57) ~[spring-data-commons-1.13.6.RELEASE.jar:na]
      at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) ~[spring-aop-4.3.10.RELEASE.jar:4.3.10.RELEASE]
      at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:213) ~[spring-aop-4.3.10.RELEASE.jar:4.3.10.RELEASE]
      at com.sun.proxy.$Proxy150.findAll(Unknown Source) ~[na:na]
      at br.com.moving.service.ApiServiceImpl.list(ApiServiceImpl.java:48)
  </code></pre>
  
  <p><a href="https://i.stack.imgur.com/ul9BA.jpg" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/ul9BA.jpg" alt="enter image description here"></a></p>
  
  <p>The repository raising error when calling findAll:</p>
  
  <pre><code>@Repository
  @Transactional
  public class ApiServiceImpl implements ApiService {
  
      @PersistenceContext
      private EntityManager em;
  
      @Override
      public &lt;T&gt; Page&lt;T&gt; list(Class&lt;T&gt; clazz, Class&lt;? extends JpaSpecificationExecutor&lt;T&gt;&gt; clazz2, String search,
              Pageable pageable, Class&lt;? extends Specification&lt;T&gt;&gt; specClazz) {
          JpaSpecificationExecutor&lt;T&gt; repository = new JpaRepositoryFactory(em).getRepository(clazz2);
  
          SpecificationBuilder&lt;T&gt; builder = new SpecificationBuilder&lt;&gt;(specClazz);
          Pattern pattern = Pattern.compile("(\\w+.*?)(==|!=|&lt;|&lt;=|&gt;|&gt;=|=|===)((\\*|\\w+).*?);");
          Matcher matcher = pattern.matcher(search + ";");
          while (matcher.find()) {
              builder.with(matcher.group(1), matcher.group(2), matcher.group(3));
          }
  
          org.springframework.data.jpa.domain.Specification&lt;T&gt; spec = builder.build();
          Page&lt;T&gt; page = repository.findAll(spec, pageable);
  
          return page;
      }
  ...
  </code></pre>
  
  <p>ApiService interface</p>
  
  <pre><code>import org.springframework.data.domain.Page;
  import org.springframework.data.domain.Pageable;
  import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
  
  import br.com.mycompany.specification.Specification;
  
  public interface ApiService {
  
      &lt;T&gt; Page&lt;T&gt; list(Class&lt;T&gt; clazz, Class&lt;? extends JpaSpecificationExecutor&lt;T&gt;&gt; clazz2, String search, Pageable pageable, Class&lt;? extends Specification&lt;T&gt;&gt; customSpec);
  
      &lt;T&gt; T get(Class&lt;T&gt; clazz, Class&lt;? extends JpaSpecificationExecutor&lt;T&gt;&gt; clazz2, String search, Class&lt;? extends Specification&lt;T&gt;&gt; customSpec);
  }
  </code></pre>
  
  <p>LocalDateTimeSerializer:</p>
  
  <pre><code>    import java.io.IOException;
      import java.time.LocalDateTime;
      import java.time.format.DateTimeFormatter;
  
      import com.fasterxml.jackson.core.JsonGenerator;
      import com.fasterxml.jackson.databind.JsonSerializer;
  
      public class LocalDateTimeSerializer extends JsonSerializer&lt;LocalDateTime&gt; {
  
          @Override
          public void serialize(LocalDateTime dateTime, JsonGenerator generator,
                  com.fasterxml.jackson.databind.SerializerProvider provider)
                  throws IOException, com.fasterxml.jackson.core.JsonProcessingException {
              if (dateTime == null) {
                  generator.writeNull();
              } else {
                  generator.writeString(dateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss")));
              }
          }
  
  }
  </code></pre>
  
  <p>Model:</p>
  
  <pre><code>import java.io.Serializable;
  import java.time.LocalDateTime;
  import java.util.HashMap;
  import java.util.Map;
  import javax.persistence.Column;
  import javax.persistence.Convert;
  import javax.persistence.Entity;
  import javax.persistence.FetchType;
  import javax.persistence.GeneratedValue;
  import javax.persistence.GenerationType;
  import javax.persistence.Id;
  import javax.persistence.JoinColumn;
  import javax.persistence.ManyToOne;
  import javax.persistence.Table;
  import javax.persistence.Transient;
  
  import com.fasterxml.jackson.annotation.JsonInclude;
  import com.fasterxml.jackson.annotation.JsonInclude.Include;
  import com.fasterxml.jackson.databind.annotation.JsonSerialize;
  
  import br.com.mycompany.converter.BooleanNumberConverter;
  import br.com.mycompany.converter.ReleaseCategoryTypeConverter;
  import br.com.mycompany.converter.ReleaseStatusTypeConverter;
  import br.com.mycompany.serializer.LocalDateTimeSerializer;
  
  
  @Entity
  @Table(name = "releases")
  @JsonInclude(Include.NON_NULL)
  public class Release implements Serializable {
  
      private static final long serialVersionUID = 1L;
  
      @Id
      @GeneratedValue(strategy = GenerationType.IDENTITY)
      @Column(name = "id", nullable = false)
      private Long id;
  
      @Column(name = "state", length = 2)
      private String state;
  
      @JsonSerialize(using = LocalDateTimeSerializer.class)
      @Column(name = "created_date", nullable = false, insertable = true, updatable = false)
      private LocalDateTime createdDate = LocalDateTime.now();
  
  //other fields, constructors, gets/sets not relevant
  </code></pre>
  
  <p>The database is Mysql. If I search straigh in MySql via Workbench I can see this sample:</p>
  
  <pre><code>select created_date from releases
  
  '0000-00-00 00:00:00'
  '0000-00-00 00:00:00'
  ...
  '2013-09-28 09:19:23'
  '2013-09-28 09:19:59'
  </code></pre>
  
  <p>By locking close the format it seems to me that LocalDateTimeSerializer.serialize is correct.</p>
  
  <p>Any clue will be highly appreciated.</p>
  
  <p>**** edited</p>
  
  <p>After read carefully <a href="https://stackoverflow.com/questions/23890687/hibernate-4-with-java-time-localdate-and-date-construct">Hibernate 4 with java.time.LocalDate and DATE() construct</a>, I checked which jar versions I have and, as far as I can see, I didn't find any tip if there is a problem with my jars. I added below two print screen which reveals which jar versions I am using.
   Additionally, I am pasting bellow the three approaches used. All three resulted in same error explained above.</p>
  
  <p>Libraries:</p>
  
  <p><a href="https://i.stack.imgur.com/lZco2.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/lZco2.png" alt="enter image description here"></a></p>
  
  <p>and</p>
  
  <p><a href="https://i.stack.imgur.com/TGpKT.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/TGpKT.png" alt="enter image description here"></a></p>
  
  <p>Approaches used with no difference at all:</p>
  
  <p>1 - removed @JsonSerialize and @Converter from column. I mean:</p>
  
  <pre><code>//@JsonSerialize(using = LocalDateTimeSerializer.class)
  //@Convert(converter = MovingLocalDateTimeConverter.class)
  @Column(name = "created_date", nullable = false, insertable = true, updatable = false)
  private LocalDateTime createdDate;
  </code></pre>
  
  <p>2 - added JsonSerialize. I mean:</p>
  
  <pre><code>import java.io.IOException;
  import java.time.LocalDateTime;
  import java.time.format.DateTimeFormatter;
  
  import com.fasterxml.jackson.core.JsonGenerator;
  import com.fasterxml.jackson.databind.JsonSerializer;
  
  public class LocalDateTimeSerializer extends JsonSerializer&lt;LocalDateTime&gt; {
  
      @Override
      public void serialize(LocalDateTime dateTime, JsonGenerator generator,
              com.fasterxml.jackson.databind.SerializerProvider provider)
              throws IOException, com.fasterxml.jackson.core.JsonProcessingException {
          if (dateTime == null) {
              generator.writeNull();
          } else {
              generator.writeString(dateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss")));
          }
      }
  
  }
  </code></pre>
  
  <p>and</p>
  
  <pre><code>@JsonSerialize(using = LocalDateTimeSerializer.class)
  @Column(name = "created_date", nullable = false, insertable = true, updatable = false)
  private LocalDateTime createdDate;
  </code></pre>
  
  <p>3 - added converter. I mean,</p>
  
  <pre><code>import java.time.DateTimeException;
  import java.time.LocalDateTime;
  import java.time.format.DateTimeFormatter;
  import javax.persistence.AttributeConverter;
  import javax.persistence.Converter;
  
  @Converter
  public class MovingLocalDateTimeConverter implements AttributeConverter&lt;LocalDateTime, String&gt; {
  
      //private DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
      private DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss");
  
      @Override
      public String convertToDatabaseColumn(LocalDateTime value) {
          return (value != null) ? value.format(fmt) : null;
      }
  
      @Override
      public LocalDateTime convertToEntityAttribute(String value) {
          return convertLocalDateTime(value);
      }
  
      private LocalDateTime convertLocalDateTime(String value) {
          try {
              return (value != null) ? LocalDateTime.parse(value.substring(0, 19), fmt) : null;
          } catch (DateTimeException e) {
              return null;
          }
      }
  
  }
  </code></pre>
  
  <p>and</p>
  
  <pre><code>@Convert(converter = MovingLocalDateTimeConverter.class)
  @Column(name = "created_date", nullable = false, insertable = true, updatable = false)
  private LocalDateTime createdDate;
  </code></pre>
  
  <p>All tentatives didn't change at all the current error.</p>