簡體   English   中英

Spring 數據 JPA 本機查詢的動態 where 子句

[英]Dynamic where clause for Spring Data JPA native query

我的 Hibernate orm.xml中有一個相當大的本機查詢。 我不能輕易地將它翻譯成 HQL 或 Criterias,但我想在這個查詢中有一個動態的 where。

似乎 TypedQueries 不是一個好主意,因為 SQL 注入,謂詞不能與本機查詢結合,那么有什么替代方法來創建動態 where 子句?

我必須構建的動態是與范圍( between )、列表( in查詢中等)相關的東西。我希望創建一個謂詞並將其注入我的查詢中,但沒有這樣的運氣。

這是我的 Spring 數據 JPA 界面的樣子:

@Query(nativeQuery = true)
fun findNearby(
    @Param("latitude") lat: Double, 
    @Param("longitude") lon: Double, 
    pageable: Pageable,
    @Param("minPopulation") minPop: Int?,
    @Param("maxPopulation") maxPop: Int?,
    @Param("houseType") type: List<HouseType>?
): Page<AreaSummary>

理想情況下,我想將populationhousetype成一個 DTO 並將其提供給查詢,但我很樂意考慮任何可行的解決方案。

使用本機查詢,您無能為力來支持動態 where 子句。 您可以做的最好的事情是嘗試調整本機查詢以支持將 null 作為參數值傳遞,但如果您在該表中有大量數據,我強烈建議您不要這樣做,因為過於通用的查詢計划通常會導致非常錯誤的行估計會導致錯誤的物理查詢計划。

IMO 你有兩到三個選擇。

  1. 為所有可能的過濾組合創建 SQL 查詢並分派到相應的存儲庫方法
  2. 遷移到 JPA 標准 API
  3. 如果 2. 不起作用,因為您需要高級 SQL 功能,請查看Blaze-Persistence ,因為它可能僅通過在核心業務邏輯之上工作的實體視圖映射公開您需要的 SQL 功能,特別是因為屬性過濾是動態的. 如果您需要更多幫助,請聯系我,因為我是該庫的維護者

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM