Как конвертировать следующий SQL-запрос, используя критерии API? - PullRequest
0 голосов
/ 17 июня 2019

У меня есть запрос, который уже написан в репозитории, расширяющем JpaRepository.Но мне нужно добавить логический оператор здесь.

select ac from Accounts ac where ac.userId = :userId and ac.accountId = :accountID

Требование заключается в получении сведений об учетной записи, когда клиент предоставляет идентификатор пользователя или идентификатор учетной записи.

public interface GoalPlanRepository extends JpaRepository<GoalPlan, String>{

    @Query("select ac from Accounts ac where ac.userId = :accountID ")
    public List<Accounts> getCalculateRecurringAmount(@Param("accountID") String accountID, @Param("userId") String userId);

Это мой репозиторий.Я реализую этот метод в goalPlanDaoImplementation

    public List<Accounts> getCalculateRecurringAmount(String accountID) {


    //      CriteriaBuilder cb = em.getCriteriaBuilder();
    //        CriteriaQuery<Accounts> cq = cb.createQuery(Accounts.class);
    // 
    //        Root<Accounts> acc = cq.from(Accounts.class);
    //        
    //        Predicate accountIDPredicate = null;
    //        Predicate userIdPredicate = null;
    //        
    //        if(accountID != null) {
    //        accountIDPredicate = cb.equal(acc.get("accountID"), accountID);
    //        }
    //        
    //        if(userId != null) {
    //        userIdPredicate = cb.equal(acc.get("userId"), userId);
    //        }
    //        
    //       
    //        cq.where(accountIDPredicate, userIdPredicate);
    //        
    //        TypedQuery<Accounts> query = em.createQuery(cq);

              List<Accounts> goalPlan = null;
              goalPlan = goalPlanRepository.getCalculateRecurringAmount(accountID);
               return goalPlan;
            //return query.getResultList();




        }

прокомментированный раздел - это то, что я пытался сделать.Заранее спасибо.:)

1 Ответ

1 голос
/ 18 июня 2019

Я не совсем уверен, правильно ли я вас понял, но, возможно, это поможет:

final ArrayList<Predicate> predicates = new ArrayList<Predicate>();
if(accountID != null) 
    predicates.add(cb.equal(acc.get("accountID"), accountID));
}
if(userId != null) {
    predicates.add(cb.equal(acc.get("userId"), userId));
}

switch(predicates.size()){
case 0:
    return null;
    //or maybe just continue to return all accounts...
case 1:
    cq.where(predicates.get(0));
    break;
default:
    cq.where(cb.and(predicates.toArray(new Predicate[predicates.size()])));
}
...