W3Cschool
恭喜您成為首批注冊(cè)用戶(hù)
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
上面的List<Trade> fetchByActionNamedQuery(String action)
示例與Spring Data查詢(xún)創(chuàng)建命名約定不匹配,因此我們必須將參數(shù)化的Spanner SQL查詢(xún)映射到它。
可以通過(guò)以下兩種方式之一將方法的SQL查詢(xún)映射到存儲(chǔ)庫(kù)方法:
namedQueries
屬性文件
@Query
批注
SQL的標(biāo)記名稱(chēng)與方法參數(shù)的@Param
帶注釋的名稱(chēng)相對(duì)應(yīng)。
自定義SQL查詢(xún)方法可以接受單個(gè)Sort
或Pageable
參數(shù),該參數(shù)將應(yīng)用于SQL中的任何排序或分頁(yè):
@Query("SELECT * FROM trades ORDER BY action DESC") List<Trade> sortedTrades(Pageable pageable); @Query("SELECT * FROM trades ORDER BY action DESC LIMIT 1") Trade sortedTopTrade(Pageable pageable);
可以使用:
List<Trade> customSortedTrades = tradeRepository.sortedTrades(PageRequest .of(2, 2, org.springframework.data.domain.Sort.by(Order.asc("id"))));
結(jié)果將按“ id”以升序排序。
您的查詢(xún)方法還可以返回非實(shí)體類(lèi)型:
@Query("SELECT COUNT(1) FROM trades WHERE action = @action") int countByActionQuery(String action); @Query("SELECT EXISTS(SELECT COUNT(1) FROM trades WHERE action = @action)") boolean existsByActionQuery(String action); @Query("SELECT action FROM trades WHERE action = @action LIMIT 1") String getFirstString(@Param("action") String action); @Query("SELECT action FROM trades WHERE action = @action") List<String> getFirstStringList(@Param("action") String action);
DML語(yǔ)句也可以通過(guò)查詢(xún)方法執(zhí)行,但是唯一可能的返回值是long
,代表受影響的行數(shù)。必須在@Query
上設(shè)置dmlStatement
布爾設(shè)置,以指示查詢(xún)方法是作為DML語(yǔ)句執(zhí)行的。
@Query(value = "DELETE FROM trades WHERE action = @action", dmlStatement = true) long deleteByActionQuery(String action);
默認(rèn)情況下,@EnableSpannerRepositories
上的namedQueriesLocation
屬性指向META-INF/spanner-named-queries.properties
文件。您可以通過(guò)提供SQL作為“ interface.method”屬性的值來(lái)在屬性文件中指定方法的查詢(xún):
Trade.fetchByActionNamedQuery=SELECT * FROM trades WHERE trades.action = @tag0
public interface TradeRepository extends SpannerRepository<Trade, String[]> { // This method uses the query from the properties file instead of one generated based on name. List<Trade> fetchByActionNamedQuery(@Param("tag0") String action); }
使用@Query
批注:
public interface TradeRepository extends SpannerRepository<Trade, String[]> { @Query("SELECT * FROM trades WHERE trades.action = @tag0") List<Trade> fetchByActionNamedQuery(@Param("tag0") String action); }
表名可以直接使用。例如,以上示例中的“交易”。或者,也可以從域類(lèi)的@Table
批注中解析表名。在這種情況下,查詢(xún)應(yīng)引用具有:
個(gè)字符之間的完全限定類(lèi)名的表名::fully.qualified.ClassName:
。
完整的示例如下所示:
@Query("SELECT * FROM :com.example.Trade: WHERE trades.action = @tag0")
List<Trade> fetchByActionNamedQuery(String action);
這允許在自定義查詢(xún)中使用用SpEL評(píng)估的表名。
SpEL也可以用于提供SQL參數(shù):
@Query("SELECT * FROM :com.example.Trade: WHERE trades.action = @tag0
AND price > #{#priceRadius * -1} AND price < #{#priceRadius * 2}")
List<Trade> fetchByActionNamedQuery(String action, Double priceRadius);
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話(huà):173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: