通用代码因 Spring 数据和 Querydsl 而失败
Posted
技术标签:
【中文标题】通用代码因 Spring 数据和 Querydsl 而失败【英文标题】:Generic code failed with Spring data and Querydsl 【发布时间】:2015-01-19 05:47:38 【问题描述】:我使用querydsl
这就是为什么我不需要像findByName()
这样的方法并且我所有的存储库接口都是空的。
所以我尝试制作通用代码以避免使用空方法的重复接口,因为我的实体中有许多由休眠映射的类。
public interface GenericResposotory<T>
extends JpaRepository<T, Integer>, QueryDslPredicateExecutor<T>
当我运行我的服务器时,我得到了这个错误:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'genericResposotory':
Invocation of init method failed; nested exception is
java.lang.IllegalArgumentException: Not an managed type: class java.lang.Object
也没有办法像我尝试做的那样制作通用存储库?
【问题讨论】:
你使用的是哪个春季版本? 我将 4.0.5.RELEASE 用于 spring,1.6.0.RELEASE 用于 spring-data-jpa 【参考方案1】:Spring 数据尝试为您创建的所有扩展 JpaRepository 的接口创建 bean。如果您想拥有一种不会使用的基础存储库,请将您的接口标记为@NoRepositoryBean
【讨论】:
我标记了它,但是当我尝试@Autowired private GenericRespository<Region> region_repository;
时我得到Could not autowire field: private repository.GenericRespository
好的,所以我误解了这个问题。我认为这个接口是其他东西的基础,你可以用其他接口扩展它。在那种情况下,我认为不可能实现你想要的。您只需将通用接口扩展为其他接口并将 T 设置为某个类。【参考方案2】:
Repository
是spring的一个marker接口,通过提取实体的类型,帮助找到自己的扩展仓库,创建仓库。我们可以在RepositoryFactorySupport
看到:
Factory bean 用于创建给定存储库接口的实例。 创建一个实现配置的*存储库接口的代理 并应用建议将控制权交给 QueryExecuterMethodInterceptor 。查询*检测策略可以 通过设置 QueryLookupStrategy.Key 配置。
这就是为什么,我认为,你不能直接创建通用存储库。
但是您可以尝试使用RepositoryFactorySupport
(实现JpaRepositoryFactory
)来生成存储库并手动将其放入上下文中。
另外,您可以通过将存储库定义为内部接口来减少项目中的文件数量和命名空间污染:只需添加一个属性,如下所示:
<jpa:repositories base-package="com.pack" consider-nested-repositories="true"/>
【讨论】:
以上是关于通用代码因 Spring 数据和 Querydsl 而失败的主要内容,如果未能解决你的问题,请参考以下文章
在 Spring Data 中为同一 QueryDSL 路径创建多个别名
直接从querydsl更新数据时如何刷新Spring JPA?