春天JPA方法名验证
问题描述:
春JpaRepository可以生成从接口方法的名称的SQL查询:春天JPA方法名验证
@Repository
@Transactional
public interface SomeEntityRepository extends JpaRepository<SomeEntity, Long> {
List<SomeEntity> findAllByEntityId(Long id);
List<SomeEntity> findAllByEntityIdAndDateOfCreationBetweenAnd/*...*/(Long id, /*...*/);
}
正如你所看到的 - 它可以是复杂的。因此,方法名称可能不正确,并且会发生编译器错误。
问:
是否可以查看/在实际项目中使用它(这需要一定的编译时间,试验和错误)之前验证方法的名字吗?
或者也许有可能在使用前将这种方法名称转换为SQL - 以查看此方法名称是否有效,以及它是否可以执行所有操作?
当然,显而易见的方法是只做小测试项目。但我觉得它一定是更好的方法。
感谢您的任何建议。
答
您可以使用测试数据库和Spring测试运行器编写测试。有多种方法可以做到这一点,所以我只给一个草图让你开始:
- 不是您的真实数据源的Spring bean的,使用的内存(如H2创建一个测试数据源的bean。 )数据库
- 创建Spring的测试范围内,即会:
- 发现你的实体
- 成立了DB模式(例如,使用
hibernate.hbm2ddl.auto=create
) - 可选择预先填写DB一些数据(例如,使用
hibernate.hbm2ddl.import_files
) - 启用和发现你的Spring数据仓库
- 使用
@RunWith(SpringJUnit4ClassRunner.class)
使用JUnit运行测试。 - 使用
@ContextConfiguration
指向您的测试Spring上下文 - 使用
@Transactional
,使测试的事务,并在测试方法进行任何更改回滚自动 -
@Autowire
的EntityManager
和Spring数据仓库和测试使用。
查看Spring文档Integration Testing。
答
有点晚了这一点,但是....
如果你想测试方法的名称,而不编译接口,你可以找到一个名为PartTree在org.springframework.data类。 repository.query.parser in spring-data-commons:1.12.6 jar。
新PartTree(stringVersionOfMethodName,classOfEntityRepoIsFor)
它会抛出一个异常,如果它不能正确解析名称。
Maven的我使用1.4.3.RELEASE的弹簧引导起动父母和包括弹簧引导起动数据JPA depedency
Spring并验证该方法正确翻译** JPQL **。所以查询应该总是在语法上是正确的。但这并不意味着它会做你期望的事情。这就是为什么你应该写自动化测试。此外,它不是会发生的*编译器*错误,而是* runtime *错误。 –