我正在尝试从表中选择多个值,其中输入可以是表的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种可能性。
那么有没有更简单的解决方案?
谢谢!
答案 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)