Spring Cloud 自定義SQL / DML查詢方法

2024-01-11 15:06 更新

上面的List<Trade> fetchByActionNamedQuery(String action)示例與Spring Data查詢創(chuàng)建命名約定不匹配,因此我們必須將參數(shù)化的Spanner SQL查詢映射到它。

可以通過以下兩種方式之一將方法的SQL查詢映射到存儲庫方法:

  • namedQueries屬性文件
  • 使用@Query批注

SQL的標(biāo)記名稱與方法參數(shù)的@Param帶注釋的名稱相對應(yīng)。

自定義SQL查詢方法可以接受單個SortPageable參數(shù),該參數(shù)將應(yīng)用于SQL中的任何排序或分頁:

	@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”以升序排序。

您的查詢方法還可以返回非實(shí)體類型:

  	@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語句也可以通過查詢方法執(zhí)行,但是唯一可能的返回值是long,代表受影響的行數(shù)。必須在@Query上設(shè)置dmlStatement布爾設(shè)置,以指示查詢方法是作為DML語句執(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文件。您可以通過提供SQL作為“ interface.method”屬性的值來在屬性文件中指定方法的查詢:

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);
}

表名可以直接使用。例如,以上示例中的“交易”。或者,也可以從域類的@Table批注中解析表名。在這種情況下,查詢應(yīng)引用具有:個字符之間的完全限定類名的表名::fully.qualified.ClassName: 完整的示例如下所示:

@Query("SELECT * FROM :com.example.Trade: WHERE trades.action = @tag0")
List<Trade> fetchByActionNamedQuery(String action);

這允許在自定義查詢中使用用SpEL評估的表名。

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);
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號