Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SpringDataJPA自定义存储库,如何应用逻辑_Java_Jpa_Spring Data_Spring Data Jpa - Fatal编程技术网

Java SpringDataJPA自定义存储库,如何应用逻辑

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

我尝试实现一个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
}
以及其他可能的配置,例如,在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的建议轻松实现您的需求。看到我的答案了吗?谢谢你的解释。现在情况更清楚了。我更喜欢老式的查询,但我尝试实现它来增长我的知识。祝你今天愉快