Spring Cloud Datastore 自定義GQL查詢方法

2024-01-12 09:34 更新

可以通過以下兩種方式之一將自定義GQL查詢映射到存儲庫方法:

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

帶注釋的查詢方法

使用@Query批注:

GQL的標記名稱與方法參數(shù)的@Param帶注釋的名稱相對應。

public interface TraderRepository extends DatastoreRepository<Trader, String> {

  @Query("SELECT * FROM traders WHERE name = @trader_name")
  List<Trader> tradersByName(@Param("trader_name") String traderName);

  @Query("SELECT * FROM  test_entities_ci WHERE id = @id_val")
  TestEntity getOneTestEntity(@Param("id_val") long id);
}

支持以下參數(shù)類型:

  • com.google.cloud.Timestamp
  • com.google.cloud.datastore.Blob
  • com.google.cloud.datastore.Key
  • com.google.cloud.datastore.Cursor
  • java.lang.Boolean
  • java.lang.Double
  • java.lang.Long
  • java.lang.String
  • enum值。將這些查詢?yōu)?code class="literal" i="6305">String值。

Cursor外,還支持每種類型的數(shù)組形式。

如果要獲取查詢的項數(shù)或查詢返回的項,請分別設置@Query批注的count = trueexists = true屬性。在這些情況下,查詢方法的返回類型應為整數(shù)類型或布爾類型。

Cloud Datastore提供的SELECT key FROM …?特殊列適用于所有類型,可檢索Key`s of each row. Selecting this special `key列,對于countexists查詢特別有用和高效。

您還可以查詢非實體類型:

	@Query(value = "SELECT __key__ from test_entities_ci")
	List<Key> getKeys();

	@Query(value = "SELECT __key__ from test_entities_ci limit 1")
	Key getKey();

	@Query("SELECT id FROM test_entities_ci WHERE id <= @id_val")
	List<String> getIds(@Param("id_val") long id);

	@Query("SELECT id FROM test_entities_ci WHERE id <= @id_val limit 1")
	String getOneId(@Param("id_val") long id);

SpEL可用于提供GQL參數(shù):

@Query("SELECT * FROM |com.example.Trade| WHERE trades.action = @act
  AND price > :#{#priceRadius * -1} AND price < :#{#priceRadius * 2}")
List<Trade> fetchByActionNamedQuery(@Param("act") String action, @Param("priceRadius") Double r);

種類名稱可以直接寫在GQL批注中。種類名稱也可以通過域類上的@Entity注釋來解析。

在這種情況下,查詢應引用表名,該表名具有完全合格的類名,并用|字符包圍:|fully.qualified.ClassName|當SpEL表達式以提供給@Entity批注的種類名稱出現(xiàn)時,此功能很有用。 例如:

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

具有命名查詢屬性的查詢方法

您還可以在屬性文件中使用Cloud Datastore參數(shù)標簽和SpEL表達式指定查詢。

默認情況下,@EnableDatastoreRepositories上的namedQueriesLocation屬性指向META-INF/datastore-named-queries.properties文件。您可以通過提供GQL作為“ interface.method”屬性的值來在屬性文件中指定對方法的查詢:

Trader.fetchByName=SELECT * FROM traders WHERE name = @tag0
public interface TraderRepository extends DatastoreRepository<Trader, String> {

	// This method uses the query from the properties file instead of one generated based on name.
	List<Trader> fetchByName(@Param("tag0") String traderName);

}
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號