簡體   English   中英

如何在Spring Boot Crud存儲庫中編寫條件自定義查詢

[英]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>

EntityClassRepo

public class EntityClassRepo extends extends JpaRepository<Demo, Long>, 
                                             JpaSpecificationExecutor<Demo> {
}

所以現在您可以使用該方法

List< T > findAll(@Nullable Specification<T> spec)

  • findAll()采用Specificaion類,因此定義一個規范,您可以在其中動態提供條件

我不確定您需要什么查詢,但是以下內容將為您提供一個思路。

EntityClassSpecificaiton(新類)

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM