我希望创建一个Spring Data存储库接口,它需要两个参数。有没有办法使它具有以下行为?
MyObject findByParameterOneAndParameterTwo( String parameterOne, String parameterTwo);
如果两个参数都有值,我希望它能够正常工作并对这两个值执行“AND”操作。如果例如第二个参数为null,则仅通过ParameterOne进行搜索。
有什么建议吗?
我希望创建一个Spring Data存储库接口,它需要两个参数。有没有办法使它具有以下行为?
MyObject findByParameterOneAndParameterTwo( String parameterOne, String parameterTwo);
如果两个参数都有值,我希望它能够正常工作并对这两个值执行“AND”操作。我在Spring/JPA领域还是新手,
使用'Query By Example'
我正在使用(在serviceImp中),以下所有参数都是可选的/取决于用户选择
`
.
if (!firstName.isEmpty() ) {
staff.setFirstName(firstName);
}
if (!lastName.isEmpty() ) {
staff.setLastName(lastName);
}
if (!ptAadhar.isEmpty() ) {
patient.setPtAadhar(ptAadhar);
}
if (!Cell.isEmpty() ) {
staff.setCell(Cell);
}
Example<StaffEntity> example = Example.of(staff);
List<StaffEntity> staffList =staffRepository.findAll(example);
.
@Query(value = "select distinct P from PostEntity P where (P.community.id = :communityId or P.communityParentCategory.id in :parentCats or P.communityCategory.id in :cats or (:countryId is not null and P.country.id=:countryId) or (:stateId is not null and P.state.id=:stateId) or (:districtId is not null and P.district.id=:districtId)) and (:postType is null or P.postType = :postType) and (:isNotice is null or P.isNotice = :isNotice) and (:isReported is null or P.isReported = :isReported) and (:isInternalPost is null or P.isInternalPost = :isInternalPost) and P.parent.id is null and P.status = :postStatus order by P.createdDate desc")
Page<PostEntity> getCommunityPosts(int communityId, Pageable pageable, PostType postType, PostStatus postStatus, Boolean isNotice, Boolean isReported, Boolean isInternalPost, Set<Long> cats, Set<Long> parentCats, Long countryId, Long stateId, Long districtId);
(:stateId 不为空且 P.state.id=:stateId) 或者 (:districtId 不为空且 P.district.id=:districtId))
在这种情况下评估得非常好。`MyObject findByParameterOneAndParameterTwo( String parameterOne, String parameterTwo);`
`myobject0_.parameterTwo is null`
例如:repository.findByParameterOneAndParameterTwo("D", null);
参考:https://www.baeldung.com/spring-data-jpa-null-parameters#query-methods
我不确定是否可以将Repo用作单独的类,但您可以使用带有选项参数的StringBuilder append查询。这肯定会起作用。
StringBuilder queryBuilder = new StringBuilder();
queryBuilder.append("select p.name from personDemographic p ");
Boolean flag = true;
if(parameterOne != null){
if(flag){
queryBuilder.append("where condition...");
flag=false;
}
}
if(parameterOne != null){
if(flag){
queryBuilder.append("where condition...");
flag = false;
}else{
queryBuilder.append("and condition...");
}
Query query = entityManager.createQuery(queryBuilder.toString());
@Query
和QueryDSL。SQL和JPA支持COALESCE
函数,该函数可用于解决某些参数可能具有NULL
值的情况。应该可以使用@Query("SELECT e FROM MyObject e WHERE COALESCE(e.parameterOne, ?1) = ?1 AND COALESCE(e.parameterOne, ?2) = ?2")
来解决问题。 - manishCOALESCE(?1, e.parameterOne) = e.parameterOne
是你的意图。 - Blank