Ignite query implementation.
- Supports query tuning parameters
- Supports projections
- Supports Page and Stream responses
- Supports SqlFieldsQuery resultset transformation into the domain entity
- Supports named parameters (:myParam) into SQL queries, declared using @Param("myParam") annotation
- Supports advanced parameter binding and SpEL expressions into SQL queries
- Template variables:
#entityName
- the simple class name of the domain entity
- Method parameter expressions: Parameters are exposed for indexed access ([0] is the first query method's
param) or via the name declared using @Param. The actual SpEL expression binding is triggered by '?#'. Example:
?#{[0]} or ?#{#myParamName}
- Advanced SpEL expressions: While advanced parameter binding is a very useful feature, the real power of
SpEL stems from the fact, that the expressions can refer to framework abstractions or other application components
through SpEL EvaluationContext extension model.
Examples:
@Query
(value = "SELECT * from #{#entityName} where email = :email")
User searchUserByEmail( @Param
("email") String email);
@Query
(value = "SELECT * from #{#entityName} where country = ?#{[0]} and city = ?#{[1]}")
List searchUsersByCity( @Param
("country") String country, @Param
("city") String city,
Pageable pageable);
@Query
(value = "SELECT * from #{#entityName} where email = ?")
User searchUserByEmail(String email);
@Query
(value = "SELECT * from #{#entityName} where lucene = ?#{
luceneQueryBuilder.search().refresh(true).filter(luceneQueryBuilder.match('city',#city)).build()}")
List searchUsersByCity( @Param
("city") String city, Pageable pageable);
- Supports SpEL expressions into Text queries (
TextQuery
). Examples:
@Query
(textQuery = true, value = "email: #{#email}")
User searchUserByEmail( @Param
("email") String email);
@Query
(textQuery = true, value = "#{#textToSearch}")
List searchUsersByText( @Param
("textToSearch") String text, Pageable pageable);
@Query
(textQuery = true, value = "#{[0]}")
List searchUsersByText(String textToSearch, Pageable pageable);
@Query
(textQuery = true, value = "#{luceneQueryBuilder.search().refresh(true).filter(luceneQueryBuilder
.match('city', #city)).build()}")
List searchUserByCity( @Param
("city") String city, Pageable pageable);
- Supports dynamic query and tuning at runtime by using
DynamicQueryConfig
method parameter. Examples:
@Query
(value = "SELECT * from #{#entityName} where email = :email")
User searchUserByEmailWithQueryTuning( @Param
("email") String email, @Param
("ignoredUsedAsQueryTuning") DynamicQueryConfig config);
@Query
(dynamicQuery = true)
List searchUsersByCityWithDynamicQuery( @Param
("country") String country, @Param
("city") String city,
@Param
("ignoredUsedAsDynamicQueryAndTuning") DynamicQueryConfig config, Pageable pageable);
...
DynamicQueryConfig onlyTunning = new DynamicQueryConfig().setCollocated(true);
repo.searchUserByEmailWithQueryTuning("user@mail.com", onlyTunning);
DynamicQueryConfig withDynamicQuery = new DynamicQueryConfig().value("SELECT * from #{#entityName} where country = ?#{[0] and city = ?#{[1]}").setForceFieldsQuery(true).setLazy(true).setCollocated(true);
repo.searchUsersByCityWithDynamicQuery("Spain", "Madrid", withDynamicQuery, new PageRequest(0, 100));