簡體   English   中英

@Query注釋和帶引號的字符串中的命名參數

[英]@Query annotation and named parameters in quoted strings

因此,這是本機MySQL查詢,我想在其中獲取基於JSON鍵值對(ev_data是json類型列)的所有行,並且工作得很好:

SELECT * FROM event WHERE JSON_CONTAINS(ev_data, '{"key":"key1","value":"val1"}','$.items')

ev_data列內容的示例:

{"items":[{"key":"key1","value":"val1"},{"key":"key2","value":"val2"}]}

現在,我將Spring Boot的CrudRepository接口和@Query注釋用於我的自定義提取方法,如下所示:

@Query(value="SELECT * FROM event WHERE JSON_CONTAINS(ev_data, '{\"key\" : \"key1\", \"value\" : :value}', '$.items')", nativeQuery=true)
Set<Event> findAllByItemKey1Value(@Param("value") String value);

但是,這將無法正常工作並觸發如下異常: java.lang.IllegalArgumentException: Parameter with that name [value] did not exist因為顯然, 您不允許在帶引號的字符串中使用參數(命名或索引) 不確定是JPA / JPQL還是Spring Boot,但這是事實。

到目前為止,我發現的唯一解決方法是使用MySQL字符串REPLACE()函數:

@Query(value="SELECT * FROM event WHERE JSON_CONTAINS(ev_data, REPLACE('{\"key\" : \"key1\", \"value\" : \"*v*\"}','*v*', :value), '$.items')", nativeQuery=true)
Set<Event> findAllByItemKey1Value(@Param("value") String value);

它不是很優雅,但對我有用,類似的技巧也適用於引號內使用的任何命名參數。

無論如何,請告訴我您是否認為可以做得更好或更潔一點 ,-)

暫無
暫無

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

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