使用JPA

时间:2019-05-12 22:44:50

标签: spring-boot spring-data-jpa

我正在尝试从表中选择多个值,其中输入可以是表的5列中的任何一列或这些字段的组合。

为了在JPA中使用findByField,我必须使用findByField的许多组合,并通过检查哪个字段为空白来有选择地调用它们。

有没有更简单的解决方案?

我要查询的表中有5列。

如果用户输入全部5个,那么我想使用下面的全部5个字段进行选择。

select * from table where field1 = :field1 and field2 = :field2 and field3 = :field3 and field4 = :field4 and field5 = :field5;

但是,如果用户仅输入2个字段,那么我只想查询这2个字段。

select * from table where field3 = :field3 and field5 = :field5.

在JPA中,我们可以进行findByField1AndField2AndField3

但是我有5种不同的输入可能性,我将不得不创建120种可能性。

那么有没有更简单的解决方案?

谢谢!

2 个答案:

答案 0 :(得分:1)

似乎没有自动生成器来构建JPA查询的所有可能组合,但是您应该使用JPA动态查询的功能,如下所示:

为所有字段构建谓词,并根据用户输入应用它们。

public List<Employee> findByCriteria(String employeeName){
        return employeeDAO.findAll(new Specification<Employee>() {
            @Override
            public Predicate toPredicate(Root<Employee> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {
                List<Predicate> predicates = new ArrayList<>();
                if(employeeName!=null) {
                    predicates.add(criteriaBuilder.and(criteriaBuilder.equal(root.get("employeeName"), employeeName)));
                }
                return criteriaBuilder.and(predicates.toArray(new Predicate[predicates.size()]));
            }
        });
    }

有用的链接:https://javadeveloperzone.com/spring/spring-jpa-dynamic-query-example/

答案 1 :(得分:0)

您可以在@Query界面中使用自定义@Repository,并根据需要添加任意数量的参数。

 @Query(value="SELECT *
               FROM table
               WHERE (:field1 IS NULL
                      OR field1 = :field1)
               AND (:field2 IS NULL
                    OR field2 = :field2)",
        nativeQuery=true)
 public Table findMatchingTable(@Param("field1") String field1, @Param("field2") String field2)