[英]@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.