[ 
https://issues.apache.org/jira/browse/IGNITE-13005?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Manuel Núñez updated IGNITE-13005:
----------------------------------
    Description: 
I have it working for Spring Data 2 (2.7.6) module with some interesting 
improvements, but by now I don't have enough time to give it the attention it 
requires, full unit/integration tests..., sorry a lot. ¿maybe any of you have 
the time?. Thanks community!!

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

Some examples:

{code:java}
// 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> {

...

}
{code}

{code:java}
// named parameter
@Query(value = "SELECT * from #{#entityName} where email = :email")
User searchUserByEmail(@Param("email") String email);
{code}
{code:java}
// 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);
{code}
{code:java}
// ordered method parameters
@Query(value = "SELECT * from #{#entityName} where email = ?")
User searchUserByEmail(String email);
{code}
{code:java}
// Advanced SpEL expressions
@Query(value = "SELECT * from #{#entityName} where uuidCity = 
?#{mySpELFunctionsBean.cityNameToUUID(#city)}")
List<User> searchUsersByCity(@Param("city") String city, Pageable pageable);
{code}
{code:java}
// textQuery - evaluated SpEL named parameter
@Query(textQuery = true, value = "email: #{#email}")
User searchUserByEmail(@Param("email") String email);
{code}
{code:java}
// textQuery - evaluated SpEL named parameter
@Query(textQuery = true, value = "#{#textToSearch}")
List<User> searchUsersByText(@Param("textToSearch") String text, Pageable 
pageable);
{code}
{code:java}
// textQuery - evaluated SpEL indexed parameter
@Query(textQuery = true, value = "#{[0] }")
List<User> searchUsersByText(String textToSearch, Pageable pageable);
{code}
{code:java}
// 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);
{code}

  was:
I have it working for Spring Data 2 (2.7.6) module with some interesting 
improvements, but by now I don't have enough time to give it the attention it 
requires, full unit/integration tests..., sorry a lot. ¿maybe any of you have 
the time?. Thanks community!!

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

Some examples:

{code:java}
// 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> {

...

}
{code}

{code:java}
// named parameter
@Query(value = "SELECT * from #{#entityName} where email = :email")
User searchUserByEmail(@Param("email") String email);
{code}
{code:java}
// 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);
{code}
{code:java}
// ordered method parameters
@Query(value = "SELECT * from #{#entityName} where email = ?")
User searchUserByEmail(String email);
{code}
{code:java}
// Advanced SpEL expressions
@Query(value = "SELECT * from #{#entityName} where uuidCity = 
?#{mySpELFunctionsBean.cityNameToUUID(#city)}")
List<User> searchUsersByCity(@Param("city") String city, Pageable pageable);
{code}
{code:java}
// textQuery - evaluated SpEL named parameter
@Query(textQuery = true, value = "email: #{#email}")
User searchUserByEmail(@Param("email") String email);
{code}
{code:java}
// textQuery - evaluated SpEL named parameter
@Query(textQuery = true, value = "#{#textToSearch}")
List<User> searchUsersByText(@Param("textToSearch") String text, Pageable 
pageable);
{code}
{code:java}
// textQuery - evaluated SpEL indexed parameter
@Query(textQuery = true, value = "#{[0] }")
List<User> searchUsersByText(String textToSearch, Pageable pageable);
{code}
{code:java}
// 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);
{code}


> Spring Data 2 - JPA Improvements and working with multiple Ignite instances 
> on same JVM
> ---------------------------------------------------------------------------------------
>
>                 Key: IGNITE-13005
>                 URL: https://issues.apache.org/jira/browse/IGNITE-13005
>             Project: Ignite
>          Issue Type: Improvement
>          Components: spring
>    Affects Versions: 2.7.6
>            Reporter: Manuel Núñez
>            Assignee: Ilya Kasnacheev
>            Priority: Major
>
> I have it working for Spring Data 2 (2.7.6) module with some interesting 
> improvements, but by now I don't have enough time to give it the attention it 
> requires, full unit/integration tests..., sorry a lot. ¿maybe any of you have 
> the time?. Thanks community!!
> 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.
>  * Supports SpEL expressions into Text queries ({{TextQuery}}). 
> Some examples:
> {code:java}
> // 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> {
> ...
> }
> {code}
> {code:java}
> // named parameter
> @Query(value = "SELECT * from #{#entityName} where email = :email")
> User searchUserByEmail(@Param("email") String email);
> {code}
> {code:java}
> // 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);
> {code}
> {code:java}
> // ordered method parameters
> @Query(value = "SELECT * from #{#entityName} where email = ?")
> User searchUserByEmail(String email);
> {code}
> {code:java}
> // Advanced SpEL expressions
> @Query(value = "SELECT * from #{#entityName} where uuidCity = 
> ?#{mySpELFunctionsBean.cityNameToUUID(#city)}")
> List<User> searchUsersByCity(@Param("city") String city, Pageable pageable);
> {code}
> {code:java}
> // textQuery - evaluated SpEL named parameter
> @Query(textQuery = true, value = "email: #{#email}")
> User searchUserByEmail(@Param("email") String email);
> {code}
> {code:java}
> // textQuery - evaluated SpEL named parameter
> @Query(textQuery = true, value = "#{#textToSearch}")
> List<User> searchUsersByText(@Param("textToSearch") String text, Pageable 
> pageable);
> {code}
> {code:java}
> // textQuery - evaluated SpEL indexed parameter
> @Query(textQuery = true, value = "#{[0] }")
> List<User> searchUsersByText(String textToSearch, Pageable pageable);
> {code}
> {code:java}
> // 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);
> {code}



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to