2015-09-20 177 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。 –

相關問題