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:
by java bean
@ComponentScan({"com.slyak","your.base.package"})
by xml
<context:component-scan base-package="com.slyak,your.base.package"/>
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)
{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 .
notice: if you are using spring-boot 2.0+ or spring5 , please use the latest version 3.0.0.RELEASE
spring version | spring-data-jpa-extra version |
---|---|
spring 3 (spring-boot 1.5.x) | 2.1.x.RELEASE |
spring 4 (spring-boot 2.0.x) | 3.0.0.RELEASE |
<dependency>
<groupId>com.slyak</groupId>
<artifactId>spring-data-jpa-extra</artifactId>
<version>2.1.2.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.GenericJpaRepositoryImpl" repository-factory-bean-class="com.slyak.spring.jpa.GenericJpaRepositoryFactoryBean"/>
Notice: if you are using spring-boot, the springboot-starter-jpa-extra should be the best choice!
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.
mget
togglestatus
fakedelete
) //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);