Spring Data 2.0/2.2 integration

Hawkore Team has improved out of the box ignite-spring-data_2.0 and ignite-spring-data_2.2 modules with new features:

  • 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.
  • Supports SpEL expressions into Text queries (TextQuery).

Thanks to those improvements you can create advanced parameter binding with SpEL expressions, including access to Lucene Query builder features.

Lucene Query Builder Evaluation Context Extension for SpEL

First, you need to add one of below dependencies, depend on spring data version you need to use, to your pom.xml:

<dependency>
    <groupId>org.hawkore.libs.ignite</groupId>
    <artifactId>hk-ignite-extensions-spring-data_2.0</artifactId>
    <version>2.8.1-hk</version>
</dependency>
<dependency>
    <groupId>org.hawkore.libs.ignite</groupId>
    <artifactId>hk-ignite-extensions-spring-data_2.2</artifactId>
    <version>2.8.1-hk</version>
</dependency>

Register Lucene Query Builder Evaluation Context Extension into your Spring data configuration:

@Configuration
@EnableIgniteRepositories(basePackages = ... )
public class MyIgniteRepositoriesConfig {
[...]
    @Bean
    public EvaluationContextExtension luceneQueryBuilderExtension() {
        return new LuceneQueryBuilderEvaluationContextExtension();
    }
[...]
}

Some samples of usage into your IgniteRepository implementation through @Query annotation:

@RepositoryConfig(cacheName = "users")
public interface UserRepository extends IgniteRepository<User, UUID> {

   [...]

    // SQL Query parametrized search with named params (SqlFieldsQuery)
    @Query(value = "SELECT id, name from #{#entityName} where uname = :userName or email = :email")
    User searchUserByNameOrEmailSample1(@Param("userName") String userName, @Param("email") String email);

    // SQL Query parametrized search with method params (SqlFieldsQuery)
    @Query(value = "SELECT id, name from #{#entityName} where uname = ?#{[0]} or email = ?#{[1]}")
    User searchUserByNameOrEmailSample2(String userName, String email);

    // SQL Query with advanced lucene search (SqlFieldsQuery)
    @Query(value = "SELECT id, name from #{#entityName} where lucene = ?#{luceneQueryBuilder.search().refresh(true).filter(luceneQueryBuilder.match('email',#email)).build()}")
    User searchUserByEmailSample(@Param("email") String email);

    // SQL Query with advanced lucene search (SqlQuery)
    @Query(value = "lucene = ?#{luceneQueryBuilder.search().refresh(true).filter(luceneQueryBuilder.match('city',#city)).build()}")
    List<User> searchUsersByCitySample1(@Param("city") String city, Pageable pageable);

    // SQL Query using Lucene classic query parser search (SqlQuery)
    @Query(value = "lucene = ?#{'city:' + #city}")
    List<User> searchUsersByCitySample2(@Param("city") String city, Pageable pageable);

    // Text Query using advanced lucene search (TextQuery)
    @Query(textQuery = true, value = "#{luceneQueryBuilder.search().refresh(true).filter(luceneQueryBuilder.match('city', #city)).build()}")
    List<User> searchUsersByCitySample3(@Param("city") String city, Pageable pageable);

    // Text Query using Lucene classic query parser search (TextQuery)
    @Query(textQuery = true, value = "city: #{#city}")
    List<User> searchUsersByCitySample4(@Param("city") String city, Pageable pageable);

    // Text Query using Lucene classic query parser full text search (TextQuery)
    @Query(textQuery = true, value = "#{#textToFind}")
    List<User> searchUsersByCitySample5(@Param("textToFind") String text, Pageable pageable);

   [...]
}