[英]Spring data JPA custom repository, how apply logic
我尝试实现JPA自定义存储库。
我有一个这样的过滤器对象:
public class FilterPatient {
private String surname;
private String name;
private String cf;
... and so on
}
从前端,我根据用户输入创建一个FilterPatient实例。
因此,例如,用户可以值姓和cf属性或值和姓,等等。
我想实现一个自定义存储库,如下所示:
PatientRepository extends JpaRepository<Patient, Long> {
List<Patient> findBySurname(String surname);
List<Patient> findByName(String name);
List<Patient> findByCf(String cf);
// custom methods:
@Query("select p from Patient p where p.name = :name
and p.surname = :surname")
List<Patient> findByNameAndSurname(@Param("name") String name,
@Param("surname") String surname);
... and so on
}
题:
根据用户输入,我必须执行其他查询,那么如何管理存储库? 我必须编写查询方法以涵盖输入字段的不同组合,并且必须在服务中编写有关方法存储库调用的逻辑? 或者我可以更好地自定义方法查询参数化?
其他信息:
通常,在没有spring-data的情况下,我使用输入参数FilterPatient
定义DAO方法,因此我基于不为null的参数构建查询,然后将参数替换为query.setString
方法。 通过这种方式,我编写了一个通用方法,Spring-data和JPA存储库是否可能?
编辑
用户查询示例
SELECT FROM Patient p WHERE p.name = :name
AND p.surname = :surname
AND p.cf = :cf
和其他可能的配置,例如,在FilterPatient IS NULL的cf属性中,查询将变为:
SELECT FROM Patient p WHERE p.name = :name
AND p.surname = :surname
您有很多内置的方式来创建自定义查询,例如findByNameAndSurname
可以在没有@Query
注释的情况下工作。
您正在寻找的是规范模式,以下将与Spring Data JPA进行讨论:
https://spring.io/blog/2011/04/26/advanced-spring-data-jpa-specifications-and-querydsl/
以及有关每个查询具有查询方法的说明:
尽管此方法确实非常方便(您甚至不必编写一行实现代码即可执行查询),但它有两个缺点:首先,由于-,对于较大的应用程序,查询方法的数量可能会增加。第二点-查询定义了一组固定的条件。 为避免这两个缺点,如果您能提出一组可以动态组合以构建查询的原子谓词,这不是很酷吗?
您可以使用JPA标准API或QueryDSL来实现规范模式。 使用后者,就像让您的存储库扩展以下接口一样容易:
并将对Querydsl的支持添加到您的项目中。 对于Maven项目,您只需要将以下配置添加到POM。 该插件将自动生成构造谓词所需的Query类,然后您可以使用任何参数组合调用存储库的以下方法:
Iterable<T> findAll(com.querydsl.core.types.OrderSpecifier<?>... orders)
Iterable<T> findAll(com.querydsl.core.types.Predicate predicate)
Iterable<T> findAll(com.querydsl.core.types.Predicate predicate, com.querydsl.core.types.OrderSpecifier<?>... orders)
Page<T> findAll(com.querydsl.core.types.Predicate predicate, Pageable pageable)
Iterable<T> findAll(com.querydsl.core.types.Predicate predicate, Sort sort)
T findOne(com.querydsl.core.types.Predicate predicate)
使用这种方法,您的PatientRepository就会变得简单:
PatientRepository extends JpaRepository<Patient, Long>, QueryDslLPredicateExecutor<Patient> {
// no query methods needed
}
请注意,Spring Data Gosling发行版还添加了对将HTTP参数自动绑定到QueryDSL谓词的支持,因此您还可以删除Filter并让Spring Data端到端处理所有内容。
https://spring.io/blog/2015/09/04/what-s-new-in-spring-data-release-gosling#querydsl-web-support
这里有一些示例显示了使用各种参数调用一种查询方法:
https://stackoverflow.com/a/26450224/1356423
Maven设置:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
.....
<properties>
<querydsl.version>4.1.3</querydsl.version>
</properties>
<dependencies>
.....
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-jpa</artifactId>
<version>${querydsl.version}</version>
</dependency>
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-apt</artifactId>
<version>${querydsl.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
....
<plugin>
<groupId>com.mysema.maven</groupId>
<artifactId>apt-maven-plugin</artifactId>
<version>1.1.3</version>
<executions>
<execution>
<goals>
<goal>process</goal>
</goals>
<configuration>
<outputDirectory>target/generated-sources/java</outputDirectory>
<processor>com.querydsl.apt.jpa.JPAAnnotationProcessor</processor>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.