可以使用Spring Data Jpa Repository创建复杂的查询吗?

问题描述 投票:1回答:2

首先是一些上下文:我有2个实体CommodityData(commodityId,代码,defaultDescription)和CommodityDescription(commodityIdlang,描述)。第一个表中的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:左联接使用on条件对记录进行一些过滤。

spring spring-boot spring-data-jpa left-join
2个回答
0
投票

您可以组合存储库和规范:

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

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

您还将获得分页,look at this example


0
投票

经过一年的发展,我们做出了让步。

使用JPA,我们甚至将自定义存储库都变得非常复杂,但是随着时间的推移,它们变得不太易于维护,并且您无法进行出色的优化。

对于CRUD操作,我们通过JPA使用SpringData,对于复杂的报告,我们使用MyBatis来优化查询。

具有类似的堆栈,所以我建议使用此组合。

© www.soinside.com 2019 - 2024. All rights reserved.