Details
-
Improvement
-
Status: Resolved
-
Major
-
Resolution: Fixed
-
2.7.6, 2.8.1
-
-
Docs Required
Description
I have it working for Spring Data 2 (2.7.6, 2.8.1) module with some interesting improvements.
Code is 100% compatible with previous versions. https://github.com/hawkore/ignite-hk/tree/master/modules/spring-data-2.0
- Supports multiple ignite instances on same JVM (@RepositoryConfig).
- Supports query tuning parameters in @Query annotation
- Supports projections
- Supports Page and Stream responses
- Supports Sql Fields Query resultset transformation into the domain entity
- Supports named parameters (:myParam) into SQL queries, declared using @Param("myParam")
- 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.
- Template variables:
- Supports SpEL expressions into Text queries (TextQuery).
Some examples:
// Spring Data Repositories using different ignite instances on same JVM @RepositoryConfig(igniteInstance = "FLIGHTS_BBDD", cacheName = "ROUTES") public interface FlightRouteRepository extends IgniteRepository<Route, String> { ... } @RepositoryConfig(igniteInstance = "GEO_BBDD", cacheName = "POIS") public interface PoiRepository extends IgniteRepository<Poi, String> { ... }
// named parameter @Query(value = "SELECT * from #{#entityName} where email = :email") User searchUserByEmail(@Param("email") String email);
// indexed parameters @Query(value = "SELECT * from #{#entityName} where country = ?#{[0] and city = ?#{[1]}") List<User> searchUsersByCity(@Param("country") String country, @Param("city") String city, Pageable pageable);
// ordered method parameters @Query(value = "SELECT * from #{#entityName} where email = ?") User searchUserByEmail(String email);
// Advanced SpEL expressions @Query(value = "SELECT * from #{#entityName} where uuidCity = ?#{mySpELFunctionsBean.cityNameToUUID(#city)}") List<User> searchUsersByCity(@Param("city") String city, Pageable pageable);
// textQuery - evaluated SpEL named parameter @Query(textQuery = true, value = "email: #{#email}") User searchUserByEmail(@Param("email") String email);
// textQuery - evaluated SpEL named parameter @Query(textQuery = true, value = "#{#textToSearch}") List<User> searchUsersByText(@Param("textToSearch") String text, Pageable pageable);
// textQuery - evaluated SpEL indexed parameter @Query(textQuery = true, value = "#{[0]}") List<User> searchUsersByText(String textToSearch, Pageable pageable);
// Static Projection @Query(value = "SELECT DISTINCT m.id, m.name, m.logos FROM #{#entityName} e USE INDEX (ORIGIN_IDX) INNER JOIN \"flightMerchants\".Merchant m ON m" + "._key=e" + ".merchant WHERE e.origin = :origin and e.disabled = :disabled GROUP BY m.id, m.name, m.logos ORDER BY m.name") List<AProjection> searchMerchantsByOrigin(@Param("origin") String origin, @Param("disabled") boolean disabled);
// Dynamic Projection @Query(value = "SELECT DISTINCT m.id, m.name, m.logos FROM #{#entityName} e USE INDEX (ORIGIN_IDX) INNER JOIN \"flightMerchants\".Merchant m ON m" + "._key=e" + ".merchant WHERE e.origin = :origin and e.disabled = :disabled GROUP BY m.id, m.name, m.logos ORDER BY m.name") <P> List<P> searchMerchantsByOrigin(Class<P> projection, @Param("origin") String origin, @Param("disabled") boolean disabled);
Attachments
Issue Links
- links to