org.springframework.dao.InvalidDataAccessApiUsageException: Parameter value [false] did not match expected type [java.lang.Boolean (n/a)];

huangapple go评论95阅读模式
英文:

org.springframework.dao.InvalidDataAccessApiUsageException: Parameter value [false] did not match expected type [java.lang.Boolean (n/a)];

问题

Entity:

  1. @MappedSuperclass
  2. @Data
  3. public abstract class Account {
  4. @Id
  5. @GeneratedValue(strategy = GenerationType.SEQUENCE)
  6. private Integer id;
  7. ...
  8. private boolean status;
  9. ...
  10. }
  11. @Entity
  12. public class AndroidAccount extends Account {
  13. private String packageApk;
  14. private String password;
  15. }

Specification builder:

  1. public Builder addFilter(String fieldName, FilterOperation operation, String value) {
  2. ...
  3. } else if (fieldName.equals("status")) {
  4. boolean isBanned = Boolean.parseBoolean(value);
  5. specification = isBanned ? specification.and(isBanned()) : specification.and(isNotBanned());
  6. }
  7. ...
  8. return this;
  9. }
  10. protected Specification<T> isBanned() {
  11. return (root, query, builder) -> builder.isFalse(root.get("status"));
  12. }
  13. protected Specification<T> isNotBanned() {
  14. return (root, query, builder) -> builder.isTrue(root.get("status"));
  15. }

Repository:

  1. @Repository
  2. public interface AndroidRepository extends PagingAndSortingRepository<AndroidAccount, Integer>,
  3. JpaSpecificationExecutor<AndroidAccount> {
  4. }
  5. Invoke here:
  6. Specification<AndroidAccount> specification = new AndroidSpecs().builder()
  7. .addFilter("domain", FilterOperation.EQUALS, "Test domain1")
  8. .addFilter("status", FilterOperation.EQUALS, "false")
  9. .build();
  10. List<AndroidAccount> accountList = androidRepository.findAll(specification);
  11. accountList.forEach(System.out::println);

With any String fields works just fine, but with boolean throws:

  1. org.springframework.dao.InvalidDataAccessApiUsageException: Parameter value [false] did not match expected type [java.lang.Boolean (n/a)]; nested exception is java.lang.IllegalArgumentException: Parameter value [false] did not match expected type [java.lang.Boolean (n/a)]
  2. at org.springframework.orm.jpa.EntityManagerFactoryUtils.convertJpaAccessExceptionIfPossible(EntityManagerFactoryUtils.java:374)
  3. at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:257)
  4. at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:528)
  5. at org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.java:61)
  6. at org.springframework.dao.support.DataAccessUtils.translateIfNecessary(DataAccessUtils.java:242)
  7. at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:153)
  8. ...
  9. Caused by: java.lang.IllegalArgumentException: Parameter value [false] did not match expected type [java.lang.Boolean (n/a)]
  10. ...
英文:

Entity:

  1. @MappedSuperclass
  2. @Data
  3. public abstract class Account {
  4. @Id
  5. @GeneratedValue(strategy = GenerationType.SEQUENCE)
  6. private Integer id;
  7. ...
  8. private boolean status;
  9. ...
  10. }
  11. @Entity
  12. public class AndroidAccount extends Account {
  13. private String packageApk;
  14. private String password;
  15. }

Specification builder:

  1. public Builder addFilter(String fieldName, FilterOperation operation, String value) {
  2. ...
  3. } else if (fieldName.equals(&quot;status&quot;)) {
  4. boolean isBanned = Boolean.parseBoolean(value);
  5. specification = isBanned ? specification.and(isBanned()) : specification.and(isNotBanned());
  6. }
  7. ...
  8. return this;
  9. }
  10. protected Specification&lt;T&gt; isBanned() {
  11. return (root, query, builder) -&gt; builder.isFalse(root.get(&quot;status&quot;));
  12. }
  13. protected Specification&lt;T&gt; isNotBanned() {
  14. return (root, query, builder) -&gt; builder.isTrue(root.get(&quot;status&quot;));
  15. }

Repository:

  1. @Repository
  2. public interface AndroidRepository extends PagingAndSortingRepository&lt;AndroidAccount, Integer&gt;,
  3. JpaSpecificationExecutor&lt;AndroidAccount&gt; {
  4. }
  5. Invoke here:
  6. Specification&lt;AndroidAccount&gt; specification = new AndroidSpecs().builder()
  7. .addFilter(&quot;domain&quot;, FilterOperation.EQUALS, &quot;Test domain1&quot;)
  8. .addFilter(&quot;status&quot;, FilterOperation.EQUALS, &quot;false&quot;)
  9. .build();
  10. List&lt;AndroidAccount&gt; accountList = androidRepository.findAll(specification);
  11. accountList.forEach(System.out::println);

With any String fields works just fine, but with boolean throws:

  1. org.springframework.dao.InvalidDataAccessApiUsageException: Parameter value [false] did not match expected type [java.lang.Boolean (n/a)]; nested exception is java.lang.IllegalArgumentException: Parameter value [false] did not match expected type [java.lang.Boolean (n/a)]
  2. at org.springframework.orm.jpa.EntityManagerFactoryUtils.convertJpaAccessExceptionIfPossible(EntityManagerFactoryUtils.java:374)
  3. at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:257)
  4. at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:528)
  5. at org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.java:61)
  6. at org.springframework.dao.support.DataAccessUtils.translateIfNecessary(DataAccessUtils.java:242)
  7. at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:153)
  8. at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
  9. at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:178)
  10. at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
  11. at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:95)
  12. at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
  13. at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212)
  14. at com.sun.proxy.$Proxy93.findAll(Unknown Source)
  15. at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  16. at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
  17. at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  18. at java.lang.reflect.Method.invoke(Method.java:498)
  19. at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:344)
  20. at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:205)
  21. at com.sun.proxy.$Proxy96.findAll(Unknown Source)
  22. ...
  23. Caused by: java.lang.IllegalArgumentException: Parameter value [false] did not match expected type [java.lang.Boolean (n/a)]
  24. at org.hibernate.query.spi.QueryParameterBindingValidator.validate(QueryParameterBindingValidator.java:54)
  25. at org.hibernate.query.spi.QueryParameterBindingValidator.validate(QueryParameterBindingValidator.java:27)
  26. at org.hibernate.query.internal.QueryParameterBindingImpl.validate(QueryParameterBindingImpl.java:90)
  27. at org.hibernate.query.internal.QueryParameterBindingImpl.setBindValue(QueryParameterBindingImpl.java:55)
  28. at org.hibernate.query.internal.AbstractProducedQuery.setParameter(AbstractProducedQuery.java:490)
  29. at org.hibernate.query.internal.AbstractProducedQuery.setParameter(AbstractProducedQuery.java:111)
  30. at org.hibernate.query.criteria.internal.compile.CriteriaCompiler$1$1.bind(CriteriaCompiler.java:135)
  31. at org.hibernate.query.criteria.internal.CriteriaQueryImpl$1.buildCompiledQuery(CriteriaQueryImpl.java:364)
  32. at org.hibernate.query.criteria.internal.compile.CriteriaCompiler.compile(CriteriaCompiler.java:165)
  33. at org.hibernate.internal.AbstractSharedSessionContract.createQuery(AbstractSharedSessionContract.java:742)
  34. at org.hibernate.internal.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:23)
  35. at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  36. at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
  37. at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  38. at java.lang.reflect.Method.invoke(Method.java:498)
  39. at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:314)
  40. at com.sun.proxy.$Proxy86.createQuery(Unknown Source)
  41. at org.springframework.data.jpa.repository.support.SimpleJpaRepository.getQuery(SimpleJpaRepository.java:700)
  42. at org.springframework.data.jpa.repository.support.SimpleJpaRepository.getQuery(SimpleJpaRepository.java:677)
  43. at org.springframework.data.jpa.repository.support.SimpleJpaRepository.findAll(SimpleJpaRepository.java:433)
  44. at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  45. at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
  46. at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  47. at java.lang.reflect.Method.invoke(Method.java:498)
  48. at org.springframework.data.repository.core.support.ImplementationInvocationMetadata.invoke(ImplementationInvocationMetadata.java:72)
  49. at org.springframework.data.repository.core.support.RepositoryComposition$RepositoryFragments.invoke(RepositoryComposition.java:382)
  50. at org.springframework.data.repository.core.support.RepositoryComposition.invoke(RepositoryComposition.java:205)

答案1

得分: 1

Specification specification = new AndroidSpecs().builder()
.addFilter("domain", FilterOperation.EQUALS, "Test domain1")
.addFilter("status", FilterOperation.EQUALS, Boolean.FALSE)
.build();

Instead of passing "false" as a String, try passing Boolean.FALSE. As the error suggests, the parameter passed doesn't match the expected type Boolean.

And try changing the "status" field in your Entity from boolean (primitive) --> Boolean (Wrapper Class) if there's no specific use case.

英文:
  1. Specification&lt;AndroidAccount&gt; specification = new AndroidSpecs().builder()
  2. .addFilter(&quot;domain&quot;, FilterOperation.EQUALS, &quot;Test domain1&quot;)
  3. .addFilter(&quot;status&quot;, FilterOperation.EQUALS, Boolean.FALSE)
  4. .build();

Instead of passing "false" as String , try passing Boolean.FALSE. As the error suggests the parameter passed didn't meet the expected type Boolean.

And try changing "status" field in your Entity from boolean(primitive) --> Boolean(Wrapper Class) if there's no specific use case.

huangapple
  • 本文由 发表于 2020年8月15日 16:31:05
  • 转载请务必保留本文链接:https://go.coder-hub.com/63424098.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定