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

时间:2019-02-11 23:31:55

标签: spring spring-boot spring-data-jpa left-join

首先,我有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:左联接使用 on 条件对记录进行一些过滤。

2 个答案:

答案 0 :(得分:0)

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

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

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

您还将获得分页look at this example

答案 1 :(得分:0)

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

使用JPA,我们甚至将自定义存储库变得非常复杂,但是随着时间的推移,它们发现它们的可维护性不是很高,您无法进行出色的优化。

对于CRUD操作,我们在JPA上使用SpringData,对于复杂报表,我们使用MyBatis来优化查询。

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