2015-09-20 102 views
4

我正在浏览Spring Data JPA教程。 我是困惑关于这个框架如何在内部工作。 让我提出具体的方案Spring Data JPA如何在内部工作

有这是简单地通过下面的接口

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

和相应的测试用例更换特定代码

/** 
* 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; 
} 

工作的罚款

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

新的测试案例

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

我的问题

  • 如何框架知道如果我使用寻找精确匹配=或使用SQL LIKE操作部分匹配(它不能是方法的名字吗?)
  • 如果它在某种程度上决定我我正在寻找部分匹配,然后仍然有子选项...像名称%或%名称或%名称%...
  • 也如何决定案例是重要的像? (我可以像使用toUpper()一样使用SQL来区分大小写,即通过比较大写的所有内容)
  • (增加的问题)有没有一种方法可以检查日志中的EXACT SQL?

希望我能够正确解释我的问题。让我知道如果我需要添加更清晰。

+1

我建议阅读参考指南,[这里](http://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.query-methods.query-creation )和[这里](http://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.query-methods)。简而言之,它基于你的方法如何命名。 –

+0

有没有办法检查日志中的EXACT SQL? – Lav

回答

7

我建议查看参考指南的Query Creation部分。它很清楚地解释了规则。

例如,当您想通过名字查找用户并忽略大小写时,您可以使用方法名称,如findByFirstnameIgnoreCase,这将转换为UPPER(x.firstame) = UPPER(?1)的条件。

默认情况下,当你有findByProperty方法,与之匹配的是精确的,所以如果你想有LIKE功能,你会使用的方法名findByFirstnameLike这又将转化为条件where x.firstname like ?1

您可以合并这些关键字,但它可能会有点疯狂。就个人而言,我更喜欢使用@Query注释来进行更复杂的查询,以避免超长的存储库方法名称。

+0

有没有一种方法可以检查日志中的某些EXACT SQL? – Lav

+0

@Lav您可以使用此属性('spring.jpa.show-sql = true')启用Hibernate SQL日志记录。如果您使用Spring Boot,只需将它放在application.properties(或YAML或任何您使用的) –

+0

Translete如何在哪里?什么做春天背面。这只是接口,没有重写任何只有接口抽象方法。例如,当我打电话findAll()方法发生了什么?这个接口的实现在哪里?春天使用我的实体和创建类?创建查询?我很困惑。我只想知道春天在干什么?没有方法体没有休眠代码或jpa。 –

相关问题