[英]How to write a Conditional Custom Query in Spring boot Crud Repository
我必須使用存儲庫從實體表中獲取一條記錄,該記錄根據以下2個字段有條件地擴展了CRUDRepository。
有3個字段,分別是a,b和c。
SELECT from EntityClass e where e.a = :a AND
(e.b = :b and e.c = :c). If no record found, then it should try below one
(OR e.b = :b and e.c = null). If no record found, then it should try below one
(OR e.b = null and e.c = :c). If no record found, then it should try below one
(OR e.b = null and e.c = null).
肯定會有一個或多個記錄與這四個條件中的任何一個相匹配。 但是我想要一條與任何條件匹配的記錄,並且順序從頭到尾都很重要。
如何為此編寫自定義查詢?
@Query(" ")
EntityClass findEntityForAandBandC(@Param("a") String a, @Param("b") String b, @Param("c") String c);
我可以使用if else並編寫單獨的查詢方法從Java代碼執行此操作。 但是我想為上面的代碼編寫一個查詢方法。
您可以使用JpaSpecificationExecutor<T>
public class EntityClassRepo extends extends JpaRepository<Demo, Long>,
JpaSpecificationExecutor<Demo> {
}
所以現在您可以使用該方法
List< T > findAll(@Nullable Specification<T> spec)
Specificaion
類,因此定義一個規范,您可以在其中動態提供條件 我不確定您需要什么查詢,但是以下內容將為您提供一個思路。
public class EntityClassSpecification implements Specification<EntityClass> {
private EntityClassFilter entityFilter; // This holds the value A, B & C
// Constructor
@Override
public Predicate toPredicate(Root<Demo> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {
if(/* Condition */) {
return criteriaBuilder.equal(root.get("a"), entityFilter.getA());
} else if (/* Condition */) {
return criteriaBuilder.and(criteriaBuilder.equal(root.get("b"), entityFilter.getB()), criteriaBuilder.equal(root.get("c"), entityFilter.getC()));
} else if (/* Condition */) {
return criteriaBuilder.and(criteriaBuilder.equal(root.get("b"), entityFilter.getB()), criteriaBuilder.isNull(root.get("c")));
} else if (/* Condition */) {
return criteriaBuilder.and(criteriaBuilder.isNull(root.get("b")), criteriaBuilder.equal(root.get("c"), entityFilter.getC()));
} else {
return criteriaBuilder.and(criteriaBuilder.isNull(root.get("b")), criteriaBuilder.isNull(root.get("c")));
}
}
}
public class EntityService {
@Autowire
private EntityClassRepo entityRepo;
public List<EntityClass> getEntityClass(String a, String b, String c) {
return entityRepo.findAll(new EntitySpecification(new EntityFilter(a, b, c)));
}
}
您可以將自定義函數添加到存儲庫中。 您可以用Java代碼實現自定義查詢。
示例: https : //dzone.com/articles/add-custom-functionality-to-a-spring-data-reposito
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.