2017-04-03 136 views
0

我正在開發一個spring-boot-project並使用一個JpaRepository接口。 根據Spring Data JPA - Reference Documentation,可以編寫自定義實現。在Spring Data JPA Repository中使用自定義名稱

這裏是一個顯示我想要做什麼的例子。

我有一個簡單的類客戶

@Entity 
public class Client { 
    @Id 
    Long id; 
    @Column 
    String name; 
    @Column 
    Date since; 

    // ... methods omitted 
} 

,該ClientRepository

public interface ClientRepository extends JpaRepository<Client, Long>, ClientRepositoryCustom { 
    List<Client> findBySinceBetween(Date start, Date end); 
} 

,該ClientRepositoryCustom

public interface ClientRepositoryCustom { 
    List<Client> getClientsSinceYear(int year); 
} 

終於ClientRepositoryImpl

@Repository 
public class ClientRepositoryImpl implements ClientRepositoryCustom { 
    @Overwrite 
    List<Client> getClientsSinceYear(int year) { 
    // ... implementation details 
    } 
} 

我想有一個像getClientsSinceYear(int year)查詢。

我知道我可以寫這個查詢,像這樣findBySinceBetween(Date start, Date end),並通過今年的第一天和最後一天。但我只想傳遞一個參數到函數中。

我在選擇名稱時有哪些自由度? 這甚至可能嗎? 是否有一個觸發詞,如果我想要一個與我的實體的屬性有關的名稱,我必須使用它嗎?

如果我查詢例如爲兩個屬性。它似乎我可以寫一個像findByName(String name, int year)這樣的方法,但我寧願沒有一個與方法名稱無關的附加參數的方法。

在此先感謝,任何反饋表示讚賞!

回答

3

您可以編寫自定義查詢與@Query

Spring Documentation

對於Microsoft SQL Server,你可以例如寫

@Query("select * from client_table where year(yourColumn) = ?1") 
Client findClientCreatedInYear(int year); 

你會發現在互聯網上和其他DBMS類似的SQL查詢。

+0

這似乎工作。對於這個解決方案,我不需要* ClientRepositoryCustom *,這沒關係。但是如果我想在實現中「隱藏」查詢細節,那麼沒有解決方案,或者? – morecore

+0

有可能將命名的查詢放到orm.xml中,但我喜歡@Query的解決方案,它也爲其他開發人員提供了一些透明性。從我所見過的最佳實踐中直接將這些查詢放入存儲庫。 – FireGnome

相關問題