Динамический, где JPA Spring Boot - PullRequest
0 голосов
/ 15 марта 2019

В моем приложении Spring Boot есть таблица и Pojo, как показано ниже.

@Entity
@Table(name = "attendance_summary")
public class AttendanceSummary implements Serializable {

  @Id
  @SequenceGenerator(name = "attendance_summary_id_seq",
    sequenceName = "attendance_summary_id_seq",
    allocationSize = 1)
  @GeneratedValue(strategy = GenerationType.SEQUENCE,
    generator = "attendance_summary_id_seq")
  @Column(name = "id", updatable = false)
  public Integer id;

  @Column(name = "emp_id", nullable = false)
  public Integer empId;

  @Column(name = "designation_id")
  public Integer designationId;

  @Column(name = "designation_category_id")
  public Integer designationCategoryId;

  @Column(name = "department_id")
  public Integer departmentId;

  ......
}

Теперь я хочу иметь динамические входы для этих полей. Значение пользователя может выбрать список empIds, обозначения .... или любые их комбинации или даже ни один из них. Если они не выбирают ни одно из полей, мне нужно вернуть все строки из таблицы в базе данных.

Но в jpa, когда мы пишем методы в репозитории, мы должны указывать имена полей как

public interface AttendanceSummaryRepository extends JpaRepository<Integer,AttendanceSummary>{
     List<AttendanceSummary> findByEmpIdAndDesignationId....(List<Integer> empIdList,List<Integer> designationIdList ... );
}

Это означает, что если любой из этих параметров будет нулевым, я получу ошибку или исключение, и в результате я пропущу некоторые данные.

где, как в PHP или другом подобном языке, я могу просто проверить значение нужных фильтров и просто динамически добавить предложение where в запрос.

query= "Select * from attendance_summary where ";
if(empIdList != null)
    query = query + " emp_id in empIdList "
if(designationIdList != null)
    query = query + " designation_id in designationIdList "
 .....
 //You get the idea. 

Есть ли способ сделать это с помощью jpaDataMethods, и если да, то как. Любые подробные объяснения / ссылки на ресурсы приветствуются.

Извините за плохой английский, и если я не смог правильно объяснить мою проблему.

Ответы [ 2 ]

0 голосов
/ 18 марта 2019

Взгляните на Критерии API .Это позволяет вам создавать динамические запросы.

В вашем примере, что-то похожее на это может работать:

CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<AttendanceSummary> query = cb.createQuery(AttendanceSummary.class);
Root<AttendanceSummary> root = query.from(AttendanceSummary.class);

List<Predicate> predList = new ArrayList<>();
if (empIdList != null) {
    predList.add(root.get('empId').in(empIdList));
}
if (designationIdList != null) {
    predList.add(root.get('designationId').in(designationIdList));
}
// ... You get the idea.

Predicate[] predicates = new Predicate[predList.size()];
predList.toArray(predicates);

query.where(predicates);

return entityManager.createQuery(query).getResultList();
0 голосов
/ 16 марта 2019

Вы можете достичь этого, используя аннотацию @Query. Пожалуйста, обратитесь к пружине руководство для более подробной информации.

@Query(value = "from attendance_summary where (emp_id in (?1) or ?1 is null) and (designation_id in (?2) or ?2 is null)" )

Деталь запроса:

SELECT * #implicit so removed
FROM   attendance_summary 
WHERE  ( emp_id IN (?1) #true when IDs are not null, thus apply filter
          OR ?1 IS NULL #true when user input null, return all rows ) 
       AND ( designation_id IN (?2) #true when IDs are not null, thus apply filter
              OR ?2 IS NULL #true user input null, return all rows) 

Пример проекта на github с подпружиненной загрузкой, jpa & h2. Ищите классы SchoolController & SchoolRepo, применяя ту же логику, конечные точки \school будут фильтровать результат для входных идентификаторов, а \allschool вернет все, поскольку входные данные будут нулевыми.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...