问题描述
我无法同时使用 Spring Data JPA 投影和规范.我有以下设置:
I'm not able to use Spring Data JPA projections and specifications together. I have the following setup:
实体:
@Entity
public class Country {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Column(name = "NAME", nullable = false)
private String name;
@Column(name = "CODE", nullable = false)
private String code;
---getters & setters---
}
投影界面:
public interface CountryProjection {
String getName();
}
国家/地区规范:
public class CountrySpecification {
public static Specification<Country> predicateName(final String name) {
return new Specification<Country>() {
@Override
public Predicate toPredicate(Root<Country> eventRoot, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
return criteriaBuilder.equal(eventRoot.get(Country_.name), name);
}
};
}
}
存储库:
public interface CountryRepository extends JpaRepository<Country, Long>, JpaSpecificationExecutor<Country> {
List<CountryProjection> findByName(String name); // works fine
List<CountryProjection> findAllProjectedBy(); // works fine
List<CountryProjection> findAllProjectedBy(Specification<Country> specification); //throws Exception as shown below
}
前两个方法 findByName 和 findAllProjectedBy 工作正常.而第三个方法 findAllProjectedBy(Specification specification) 抛出以下异常 -
The first two methods findByName and findAllProjectedBy works fine.Whereas the third method findAllProjectedBy(Specification specification) throws the following exception -
由:java.util.NoSuchElementException: null atjava.util.ArrayList$Itr.next(ArrayList.java:854) ~[na:1.8.0_102] 在java.util.Collections$UnmodifiableCollection$1.next(Collections.java:1042)~[na:1.8.0_102] 在org.springframework.data.jpa.repository.query.CriteriaQueryParameterBinder.bind(CriteriaQueryParameterBinder.java:63)~[spring-data-jpa-1.10.6.RELEASE.jar:na] 在org.springframework.data.jpa.repository.query.ParameterBinder.bind(ParameterBinder.java:100)~[spring-data-jpa-1.10.6.RELEASE.jar:na] 在org.springframework.data.jpa.repository.query.ParameterBinder.bindAndPrepare(ParameterBinder.java:160)~[spring-data-jpa-1.10.6.RELEASE.jar:na] 在org.springframework.data.jpa.repository.query.ParameterBinder.bindAndPrepare(ParameterBinder.java:151)~[spring-data-jpa-1.10.6.RELEASE.jar:na] 在org.springframework.data.jpa.repository.query.PartTreeJpaQuery$QueryPreparer.invokeBinding(PartTreeJpaQuery.java:218)~[spring-data-jpa-1.10.6.RELEASE.jar:na] 在org.springframework.data.jpa.repository.query.PartTreeJpaQuery$QueryPreparer.createQuery(PartTreeJpaQuery.java:142)~[spring-data-jpa-1.10.6.RELEASE.jar:na] 在org.springframework.data.jpa.repository.query.PartTreeJpaQuery.doCreateQuery(PartTreeJpaQuery.java:78)~[spring-data-jpa-1.10.6.RELEASE.jar:na] 在org.springframework.data.jpa.repository.query.AbstractJpaQuery.createQuery(AbstractJpaQuery.java:190)~[spring-data-jpa-1.10.6.RELEASE.jar:na] 在org.springframework.data.jpa.repository.query.JpaQueryExecution$CollectionExecution.doExecute(JpaQueryExecution.java:118)~[spring-data-jpa-1.10.6.RELEASE.jar:na] 在org.springframework.data.jpa.repository.query.JpaQueryExecution.execute(JpaQueryExecution.java:82)~[spring-data-jpa-1.10.6.RELEASE.jar:na] 在org.springframework.data.jpa.repository.query.AbstractJpaQuery.doExecute(AbstractJpaQuery.java:116)~[spring-data-jpa-1.10.6.RELEASE.jar:na] 在org.springframework.data.jpa.repository.query.AbstractJpaQuery.execute(AbstractJpaQuery.java:106)~[spring-data-jpa-1.10.6.RELEASE.jar:na] 在org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.doInvoke(RepositoryFactorySupport.java:482)~[spring-data-commons-1.12.6.RELEASE.jar:na] 在org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:460)~[spring-data-commons-1.12.6.RELEASE.jar:na] 在org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)~[spring-aop-4.3.5.RELEASE.jar:4.3.5.RELEASE] 在org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:61)~[spring-data-commons-1.12.6.RELEASE.jar:na] 在org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)~[spring-aop-4.3.5.RELEASE.jar:4.3.5.RELEASE] 在org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99)~[spring-tx-4.3.5.RELEASE.jar:4.3.5.RELEASE] 在org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:282)~[spring-tx-4.3.5.RELEASE.jar:4.3.5.RELEASE] 在org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)~[spring-tx-4.3.5.RELEASE.jar:4.3.5.RELEASE] 在org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)~[spring-aop-4.3.5.RELEASE.jar:4.3.5.RELEASE] 在org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:136)~[spring-tx-4.3.5.RELEASE.jar:4.3.5.RELEASE] 在org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)~[spring-aop-4.3.5.RELEASE.jar:4.3.5.RELEASE] 在org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:133)~[spring-data-jpa-1.10.6.RELEASE.jar:na] 在org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)~[spring-aop-4.3.5.RELEASE.jar:4.3.5.RELEASE] 在org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)~[spring-aop-4.3.5.RELEASE.jar:4.3.5.RELEASE] 在org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)~[spring-aop-4.3.5.RELEASE.jar:4.3.5.RELEASE] 在org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:213)~[spring-aop-4.3.5.RELEASE.jar:4.3.5.RELEASE] 在com.sun.proxy.$Proxy82.findAllProjectedBy(Unknown Source) ~[na:na] atcom.mmp.data.jpa.DataJpaApplication.run(DataJpaApplication.java:42)[类/:na] 在org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:800)[spring-boot-1.4.3.RELEASE.jar:1.4.3.RELEASE] ... 11个常用框架省略
如何实现?有什么想法吗?
How can this be achieved? Any ideas?
推荐答案
尚不支持混合投影和规范的能力.有一个错误在跟踪这个.
The ability to mix Projections and Specifications are not yet supported. There is a bug tracking this.
这篇关于如何在 spring 数据 jpa 中使用投影和规范?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!