Можно ли использовать Spring Data Jpa Repository для создания сложных запросов? - PullRequest
0 голосов
/ 12 февраля 2019

Прежде всего некоторый контекст: у меня есть 2 сущности: CommodityData ( commodityId , код, defaultDescription) и CommodityDescription ( commodityId , lang , описание).Поле defaultDescription в первой таблице использует английский, а локализованное описание - во второй таблице.

Используя чистый JPA, я получаю то, что мне нужно, но я хотел бы знать, возможно ли реализовать это с помощью репозитория SpringDataJpa и спецификаций ( избегая JPQL ).

CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<CommodityLang> query = cb.createQuery(CommodityLang.class);
Root<CommodityData> commodity = query.from(CommodityData.class);
Join<CommodityData, CommodityDescription> join = commodity.join("descriptions", JoinType.LEFT);
join.on(cb.equal(join.get("lang"), lang));
query.select(
        cb.construct(CommodityLang.class, 
                commodity.get("categoryId"), 
                commodity.get("code"), 
                commodity.get("parent"), 
                commodity.get("path"), 
                commodity.get("defaultDescription"), 
                commodity.get("legacyLink"),
                commodity.get("documentId"), 
                commodity.get("type"), 
                commodity.get("status"), 
                join.get("description"), 
                join.get("lang")
        ));

TypedQuery<CommodityLang> typedQuery = em.createQuery(query);

List<CommodityLang> results = typedQuery.getResultList();

Использование Spring Data Repository было бы интересно, потому что это позволило бы избежать обработки разбивки на страницы и сортировки, но чтение исходного кода SimpleJpaRepository, я думаю, невозможно.Это правильно?

Спасибо, Габриэле

PS: Левое объединение использует условие для , чтобы выполнить какой-либо фильтр для записей.

1 Ответ

0 голосов
/ 12 февраля 2019

Вы можете комбинировать репозитории и спецификации:

 UserSpecification useSpecification = 
  new UserSpecification(new SearchCriteria("lastname", ":", "Trump"));

List<User> results = repository.findAll(useSpecification);

Вы также получаете подкачку, посмотрите на этот пример

...