spring-boot - 如何使用 Spring Data JPA 实现自定义存储库?
问题描述
我正在尝试使用 Spring Data 实现自定义存储库,但出现以下异常:
原因:org.springframework.data.mapping.PropertyReferenceException:找不到类型 {Entity} 的属性 {name}
看起来@NoRepositoryBean工作不正常,Spring 正在扫描用它注释的接口,有谁知道如何以正确的方式进行操作?
所有存储库的自定义方法。
@NoRepositoryBean
public interface BaseRepository<T, ID> extends JpaRepository<T, ID> {
List<T> findAll(Company company);
EntityManager getEntityManager();
}
public class BaseRepositoryImpl<T, ID> extends SimpleJpaRepository<T, ID> implements BaseRepository<T, ID> {
private EntityManager entityManager;
public BaseRepositoryImpl(JpaEntityInformation<T, ?> entityInformation, EntityManager entityManager) {
super(entityInformation, entityManager);
this.entityManager = entityManager;
}
public EntityManager getEntityManager() {
return entityManager;
}
public List<T> findAll(Company company) {
//Search by company
}
}
我还有一些具有自定义方法的存储库,例如:
@NoRepositoryBean
public interface QuestionCustomRepository {
List<Question> findAllQuestionByTypeAndAsset(Integer[] assetIds);
}
public interface QuestionRepository extends BaseRepository<Question, Integer>, QuestionCustomRepository {
}
@Repository
public class QuestionCustomRepositoryImpl extends BaseRepositoryImpl<Question, Integer> implements QuestionCustomRepository {
public QuestionCustomRepositoryImpl(JpaEntityInformation<Question, ?> entityInformation, EntityManager entityManager) {
super(entityInformation, entityManager);
}
@Override
public List<Question> findAllQuestionByTypeAndAsset(Integer[] assetIds) {
EntityManager entityManager = getEntityManager();
// Call Native Query
}
}
测试
@RunWith(SpringRunner.class)
@SpringBootTest(classes = SpringBaseTest.SpringConfiguration.class, properties = "logging.level.org.springframework.data=DEBUG")
@DataJpaTest
public class SpringBaseTest {
@SpringBootApplication
@EntityScan(basePackageClasses = Question.class)
@EnableJpaRepositories(basePackageClasses = QuestionRepository.class, repositoryBaseClass = BaseRepositoryImpl.class)
public static class SpringConfiguration {
}
}
class QuestionRepository extends SpringBaseTest {
@Inject
QuestionRepository questionRepository;
@Test
public void testFindAllByAssetIts() throws Exception {
List<Question> list = questionRepository.findAllQuestionByTypeAndAsset(new Integer[]{1,2,3});
assertThat(list).hasSize(3);
}
}
感谢任何帮助,谢谢。
解决方案
问题已解决@NoRepositoryBean
,从接口中删除并仅保留BaseRepository
.
也需要删除@SpringBootTest
,因为@DataJpaTest
已经在使用。