I love spring-data-jpa, she set my hands free, crud methods are boring! However she is not perfect on dynamic native query and her return type must be an entity, although she provide us a specification solution, but i think it's heavy and not easy to use.
spring-data-jpa-extra comes to solve three problem:
- dynamic native query support like mybatis
- return type can be anything
- no code, just sql
- first add ComponentScan
by java bean
@ComponentScan({"com.slyak","your.base.package"})
by xml
<context:component-scan base-package="com.slyak,your.base.package"/>
- second extends GenericJpaRepository insteadof JpaRepository
public interface SampleRepository extends GenericJpaRepository<Sample, Long> {
@TemplateQuery
Page<Sample> findByContent(@Param("content")String content, Pageable pageable);
@TemplateQuery
CustomVO findCustomVO(@Param("id")Long id);
}
-
third create a file named Sample.sftl in your classpath:/sqls/ (you can change this path by setting placeholder spring.jpa.template-location)
- *.sftl naming rule: {EntityName}.sftl , @Entity("{EntityName}"), a simple class name will be used as EntityName if not set.
-
In version >=2.0.0.RELEASE , new template 'sftl' take place of xml (xml is complex, but it is also supported). sftl is a ftl template mixed with sqls. The template will be simplified as below. It can be recognized in Intellij IDEA , follow these steps: settings->Editor->File Types , find "Freemarker Template" and register a new type named '*.sftl',choose it's 'Template Data Language' such as 'MYSQL'.
--findByContent
SELECT * FROM t_sample WHERE 1=1
<#if content??>
AND content LIKE :content
</#if>
--findCustomVO
SELECT id,name as viewName FROM t_sample WHERE id=:id
you can use it by using source code or adding a maven dependency
notice: if the spring-data-jpa version >= 1.11.x (spring-boot version >= 1.5.x) please use 2.1.x.RELEASE .
<dependency>
<groupId>com.slyak</groupId>
<artifactId>spring-data-jpa-extra</artifactId>
<version>2.0.4.RELEASE</version>
</dependency>
config with annotation
@EnableJpaRepositories(basePackages = "your.packages", repositoryBaseClass = GenericJpaRepositoryImpl.class, repositoryFactoryBeanClass = GenericJpaRepositoryFactoryBean.class)
or with xml
<jpa:repositories base-package="your.packages" repository-base-class="com.slyak.spring.jpa.repository.GenericJpaRepositoryImpl" repository-factory-bean-class="com.slyak.spring.jpa.repository.GenericJpaRepositoryFactoryBean"/>
Methods annotated with @TemplateQuery tells QueryLookupStrategy to look up query by content,this is often used by dynamic query.
Object annotated with @TemplateQueryObject tells content process engine render params provided by object properties.
Entity assemblers can assembler entity with other entities, such as one to many relation or one to one relation.
//batch get items and put the result into a map
Map<ID, T> mget(Collection<ID> ids);
//get items one by one for cache
Map<ID, T> mgetOneByOne(Collection<ID> ids);
//get items one by one for cache
List<T> findAllOneByOne(Collection<ID> ids);
//toggle entity status if it has a Status property
void toggleStatus(ID id);
//set entity status to Status.DELETED if it has a Status property
void fakeDelete(ID... id);
- More types of content support (now freemarker)
- More JPA comparison support (now hibernate)
- Performance test and do some optimization
- More other useful features
- Change to the latest spring-data-jpa version