Spring Data JPA如何在内部工作

Lav*_*Lav 9 spring jpa spring-data spring-data-jpa

我正在阅读Spring Data JPA Tutorial.我很困惑这个框架如何在内部工作.让我说明具体情况

有特定的代码

/**
 * Custom finder
 */
public List<Location> getLocationByStateName(String name) {
    @SuppressWarnings("unchecked")
    List<Location> locs = entityManager
        .createQuery("select l from Location l where l.state like :state")
        .setParameter("state", name + "%").getResultList(); // note
        return locs;
}
Run Code Online (Sandbox Code Playgroud)

这只是由以下界面取代

@Repository
public interface LocationJPARepository extends JpaRepository<Location, Long> {
    List<Location> findByStateLike(String stateName);
}
Run Code Online (Sandbox Code Playgroud)

相应的测试用例运行良好

@Test
public void testFindWithLike() throws Exception {
   List<Location> locs = locationRepository.getLocationByStateName("New");
   assertEquals(4, locs.size());
}
Run Code Online (Sandbox Code Playgroud)

新的测试案例

@Test
public void testFindWithLike() throws Exception {
   List<Location> locs = locationJPARepository.findByStateLike("New");
   assertEquals(4, locs.size());
}
Run Code Online (Sandbox Code Playgroud)

我的问题

  • 框架如何知道我是否正在寻找使用=或部分匹配的完全匹配使用SQL运算符(它不能是方法名称?)
  • 如果它以某种方式决定我正在寻找部分匹配,那么仍然有子选项...如名称%或%名称或%名称%...
  • 它是如何决定案件的重要性一样?(我可以像使用toUpper()那样使用SQL来区分大小写,即通过比较大写的所有内容)
  • (补充问题)是否有一种方法可以检查日志中的EXACT SQL在哪里?

希望我能够正确解释我的问题.如果我需要添加更多清晰度,请告诉我.

Boh*_*rdt 9

我建议您查看参考指南的" 查询创建"部分.它非常清楚地解释了规则.

例如,当您想要通过名字找到User并忽略大小写时,您将使用方法名称,如同findByFirstnameIgnoreCase将其转换为条件UPPER(x.firstame) = UPPER(?1).

默认情况下,当您有findByProperty方法时,匹配是完全匹配的,因此如果您想要具有LIKE功能,则可以使用方法名称findByFirstnameLike,而后者又会转换为条件where x.firstname like ?1.

你可以结合这些关键字,但它可能会有点疯狂.我个人更喜欢使用@Query注释来处理更复杂的查询,以避免超长的存储库方法名称.

  • @VolkanOkçu会在幕后检查这篇文章,以了解Spring在幕后做了什么(https://calicoder.com/index.php/2018/10/24/how-spring-repositories-work/),以在存储库接口后面添加实现。 (3认同)
  • @Calicoder 看起来链接已损坏。如果您能修复,我们将不胜感激。谢谢。 (2认同)