Выберите запрос с колонками Dynami c в данных Spring JPA - PullRequest
0 голосов
/ 17 апреля 2020

У меня есть требование, когда я получаю значения из таблицы A. Здесь в таблице A хранятся сведения о столбцах таблицы B.

выберите columnList из таблицы TableA => Id1, Id2, Id3, Id4, Id5 ..

Используя результат, который мне нужно запросить из таблицы B.

Ниже приведены случаи

  1. Выберите Id1, Id2, Id3 из таблицы B.

  2. Выберите Id4, Id5 из таблицы B.

  3. Выберите Id6, Id7, Id8 из таблицы B.

Как этот случай будет расти. Я хотел бы знать, как добиться этого в Spring Data JPA. Это что-то вроде динамических c проекций в Spring Data JPA.

Примечание. Имена столбцов, хранящиеся в Таблице A, используются в Таблице B.

Причина: если бы я смог добиться этого, было бы легко получить данные, которые нужны только мне.

Нужно знать, сможем ли мы добиться этого в Spring Data JPA или нет? Если возможно, то как мы можем.

Можем ли мы использовать CriteriaQuery и CriteriaBuilder. ??? На основе количества переданных столбцов запрос на выборку будет построен с теми значениями, которые были переданы в вызове метода. Я могу передать это как список и получить результаты этого вызова метода. entityManager.createQuery (critQuery) .getResultList ();

Мне нужно лучшее решение, чем это.

public void getTableBValues(final List<String> columnList) {

    final CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();        
    final CriteriaQuery<Tuple> criteriaQuery = criteriaBuilder.createTupleQuery();
    final Root<TableB> root = criteriaQuery.from(TableB.class);

    // Construct the Selection List to get required columns from TableB
    final List<Selection<?>> pathList = columnList.stream().map(p -> {
        final Selection<Object> path = root.get(p);
        return path;
    }).collect(Collectors.toList());

    criteriaQuery.multiselect(pathList);
    // result will be stored in the result list. 
    final List<Tuple> resultList = entityManager.createQuery(criteriaQuery).getResultList();
    entityManager.close();

}

1 Ответ

1 голос
/ 21 апреля 2020

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

Существует множество способов сделать это, см. .Eg https://www.bytestree.com/spring/spring-data-jpa-projections-5-ways-return-custom-object/

Возможно, самый простой способ использования Spring JPA - это что-то вроде этого:

@Repository
public interface ClassBRepository extends JpaRepository<ClassB, Long> {

     @Query("select b.id1 as id1, b.id2 as id2, b.id3 as id3 from ClassB b")
     List<Map<String, Object>> findForUseCase123();

     @Query("select b.id4 as id4, b.id5 as id5 from ClassB b")
     List<Map<String, Object>> findForUseCase45();

     ...     
}

Это не полностью динамически c, но, опять же, если вам нужно полностью динамически c mapping, Object-Relational-Mapping не подходит для этого.

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