Spring Cloud Datastore 自定义GQL查询方法
可以通过以下两种方式之一将自定义GQL查询映射到存储库方法:
namedQueries
属性文件- 使用
@Query
批注
使用@Query
批注:
GQL的标记名称与方法参数的@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); }
支持以下参数类型:
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
值。将这些查询为String
值。
除Cursor
外,还支持每种类型的数组形式。
如果要获取查询的项数或查询返回的项,请分别设置@Query
批注的count = true
或exists = true
属性。在这些情况下,查询方法的返回类型应为整数类型或布尔类型。
Cloud Datastore提供的SELECT key FROM …
特殊列适用于所有类型,可检索Key`s of each row.
Selecting this special `key
列,对于count
和exists
查询特别有用和高效。
您还可以查询非实体类型:
@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参数:
@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
批注的种类名称出现时,此功能很有用。
例如:
@Query("SELECT * FROM |com.example.Trade| WHERE trades.action = @act") List<Trade> fetchByActionNamedQuery(@Param("act") String action);
您还可以在属性文件中使用Cloud Datastore参数标签和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); }
更多建议: