Java SpringDataJPA自定义存储库,如何应用逻辑
我尝试实现一个JPA自定义存储库 我有一个过滤器对象,如下所示:Java SpringDataJPA自定义存储库,如何应用逻辑,java,jpa,spring-data,spring-data-jpa,Java,Jpa,Spring Data,Spring Data Jpa,我尝试实现一个JPA自定义存储库 我有一个过滤器对象,如下所示: public class FilterPatient { private String surname; private String name; private String cf; ... and so on } 从前端,我根据用户输入创建FilterPatient的一个实例 例如,用户可以为姓氏和cf属性或姓氏和名称赋值,等等 我想实现一个自定义存储库,如下所示: PatientRepos
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
}
以及其他可能的配置,例如,在FilterPatient的cf属性为NULL时,查询将变为:
SELECT FROM Patient p WHERE p.name = :name
AND p.surname = :surname
您有很多内置的方法来创建自定义查询,例如
findbynameandnamesname
将在没有@Query
注释的情况下工作
您要寻找的是规范模式,下面将讨论与Spring Data JPA相关的规范模式: 关于每个查询都有一个查询方法,请注意: 尽管这种方法非常方便(您甚至不必 编写一行实现代码以获取查询 它有两个缺点:第一,查询方法的数量 对于更大的应用程序可能会增长,这是第二个原因 点-查询定义了一组固定的标准。为了避免这些 两个缺点,如果你能想出一套 可以动态组合以构建 询问 您可以使用JPA标准API或QueryDSL实现规范模式。使用后者与让存储库扩展以下界面一样简单: 以及向项目中添加对Querydsl的支持。对于Maven项目,只需将下面的配置添加到POM中即可。该插件将自动生成构造谓词所需的查询类,然后您可以使用任意参数组合调用存储库的以下方法:
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)
Iterable findAll(com.querydsl.core.types.ordersspecifier…orders)
Iterable findAll(com.querydsl.core.types.Predicate谓词)
Iterable findAll(com.querydsl.core.types.Predicate谓词,com.querydsl.core.types.OrderSpecifier…orders)
页面findAll(com.querydsl.core.types.Predicate谓词,可分页)
Iterable findAll(com.querydsl.core.types.Predicate谓词,排序)
T findOne(com.querydsl.core.types.Predicate谓词)
通过这种方法,您的耐心就会变得简单:
PatientRepository extends JpaRepository<Patient, Long>, QueryDslLPredicateExecutor<Patient> {
// no query methods needed
}
PatientPository扩展了JpaRepository、QueryDslLPredicateExecutor{
//不需要任何查询方法
}
请注意,SpringDataGosling版本还添加了对自动将HTTP参数绑定到QueryDSL谓词的支持,因此您还可以删除过滤器,并让SpringData端到端地处理所有内容
这里有一些示例显示使用各种参数调用1个查询方法:
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)
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>
4.0.0
.....
4.1.3
.....
com.querydsl
querydsl jpa
${querydsl.version}
com.querydsl
querydsl公寓
${querydsl.version}
....
com.mysema.maven
aptmaven插件
1.1.3
过程
目标/生成的源代码/java
com.querydsl.apt.jpa.JPAAnnotationProcessor
亲爱的,谢谢,但是,我的问题有点不同。我有一个由用户决定输入的对象,所以我必须在存储库中编写不同的方法,并在服务中根据输入定义如何调用?如果是这样的话,这种方式比我以前使用的方式(DAO只有一种方法)更复杂。我建议尽可能简单地使用存储库,只访问/修改数据,并为自定义逻辑提供一个服务层我必须编写7个存储库方法,并在服务中决定我必须调用7个方法中的哪一个?您可以使用两种方法:基于过滤器创建自定义查询,或者在存储库中有多个方法并在服务中使用它们。。在存储库中编写方法是一行程序。。所以我更喜欢这个选择,但这只是我的观点,谢谢。对我来说,你的答案是可以的,Spring data NO:DDo你想调用一个查询,根据用户输入过滤数据,比如等于、小于、大于。。?或者通过比较不同的属性?我认为如果是这样的话,jpa标准查询将是有帮助的。您能给出一个示例用户查询吗?您编写的第一个示例可能会对您有所帮助。您可以使用spring data JPA规范进行查询。虽然您已经接受了一个答案,但您实际上可以使用@Ruwanka Madhushan的建议轻松实现您的需求。看到我的答案了吗?谢谢你的解释。现在情况更清楚了。我更喜欢老式的查询,但我尝试实现它来增长我的知识。祝你今天愉快