2016-02-26 24 views
0

我試圖根據用戶的搜索請求顯示一組數據庫中的記錄。我不認爲在JPA存儲庫中有一個預定義的方法。因此,我想在此存儲庫中編寫一個查詢。如何在Jpa庫中編寫一個Sql查詢?

但在構建過程中,有一個異常聲明爲「IllegalArgumentException」。

有人可以幫我寫一個正確的查詢嗎?如果有更好的方法,讓我知道。

在論證的loanReport是具有用戶的搜索請求

public interface LoanReportRepository extends JpaRepository<LoanReport, Long> , JpaSpecificationExecutor<LoanReport> { 
    public final static String GET_LOAN_REPORTS = "SELECT * FROM loan_report WHERE product=loanReport.product"; 

     @Query(GET_LOAN_REPORTS) 
    List<LoanReport> findByPreference(final LoanReport loanReport); 

} 
+0

這不是JPQL。閱讀任何JPA文檔以查看該文檔。如果你真的想把SQL放入(並丟棄數據庫獨立性),Spring會有一些「原生」標誌。 –

回答

0

您可以調用JPQL查詢像這樣的對象,

public interface LoanReportRepository extends JpaRepository<LoanReport, Long> , JpaSpecificationExecutor<LoanReport> { 

public final static String GET_LOAN_REPORTS = "SELECT lr FROM LoanReport lr WHERE product = :product"; 

@Query(GET_LOAN_REPORTS) 
List<LoanReport> findByPreference(@Param("product") product); 

這裏product可以是直接存儲在一個值一個數據庫列或另一個JPA實體。在後一種情況下,實體的標識符將與LoanReport的外鍵約束進行映射。

你可以通過直接傳遞product屬性來調用findByPreference

loanReportRepository.findByPreference(loanReport.product); 

請參閱here瞭解更多信息。文檔非常好。

P.S.

據我所知,沒有內置的方法只傳遞一個對象,並期望其所有/某些屬性值映射到實體字段,然後映射到數據庫級別列。

另一種選擇是使用Spring Data JPA提供的動態查詢與您想要搜索的所有字段。有關信息,請參見here

如果要在搜索查詢中使用多個字段,最佳選擇是將所有可能的參數作爲方法參數傳遞並將它們映射到查詢參數。此方法還允許您將用戶參數值清理或轉換爲可能存儲在數據庫級別上的不同格式。

+0

我不會只發送一個搜索選項(產品),還有四個字段,這就是爲什麼我把它作爲在那種情況下我該怎麼辦?查詢中的'lr'是什麼意思? –

+0

@丹尼我已經更新了將回答你的問題的答案。 SQL查詢用[JPQL](https://en.wikipedia.org/wiki/Java_Persistence_Query_Language)編寫。如果您想使用NativeQuery選項,也可以使用本機SQL查詢。 'lr'是要在JPQL查詢的其他部分使用的'LoanReport'實體的別名。 – Bunti