SpringDataJPA存储库可以用来创建复杂的查询吗?

SpringDataJPA存储库可以用来创建复杂的查询吗?,spring,spring-boot,spring-data-jpa,left-join,Spring,Spring Boot,Spring Data Jpa,Left Join,首先是一些上下文:我有两个实体CommodityData(commodityId、code、defaultDescription)和CommodityDescription(commodityId、lang、description)。第一个表中的defaultDescription字段使用英语,本地化描述在第二个表中 使用纯JPA我得到了我需要的东西,但我想知道是否可以使用SpringDataJpa存储库和规范(避免JPQL)来实现它 CriteriaBuilder cb=em.getCrite

首先是一些上下文:我有两个实体CommodityData(commodityId、code、defaultDescription)和CommodityDescription(commodityId、lang、description)。第一个表中的defaultDescription字段使用英语,本地化描述在第二个表中

使用纯JPA我得到了我需要的东西,但我想知道是否可以使用SpringDataJpa存储库和规范(避免JPQL)来实现它

CriteriaBuilder cb=em.getCriteriaBuilder();
CriteriaQuery=cb.createQuery(CommodityLang.class);
根商品=query.from(CommodityData.class);
Join-Join=商品.Join(“说明”,JoinType.LEFT);
join.on(cb.equal(join.get(“lang”),lang));
query.select(
cb.construct(CommodityLang.class、,
商品。获取(“分类”),
商品。获取(“代码”),
商品。获取(“母公司”),
商品。获取(“路径”),
商品。获取(“默认描述”),
商品。获取(“legacyLink”),
商品。获取(“文档ID”),
商品。获取(“类型”),
商品。获取(“状态”),
join.get(“description”),
join.get(“lang”)
));
TypedQuery TypedQuery=em.createQuery(查询);
List results=typedQuery.getResultList();
使用Spring数据存储库会很有趣,因为它可以避免处理分页和排序,但我认为不可能读取SimpleParepository的源代码。对吗

谢谢,, 加布里埃尔


PS:Left join使用on条件对记录进行一些筛选。

您可以将存储库和规范结合起来:

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

List<User> results = repository.findAll(useSpecification);
UserSpecification-useSpecification=
新的用户规范(新的搜索条件(“lastname”,“lastname”,“tramp”);
列表结果=repository.findAll(useSpecification);

您还可以进行分页,

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

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

List<User> results = repository.findAll(useSpecification);
UserSpecification-useSpecification=
新的用户规范(新的搜索条件(“lastname”,“lastname”,“tramp”);
列表结果=repository.findAll(useSpecification);

您也可以使用分页,

经过一年的开发,我们已经达成了妥协

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

对于CRUD操作,我们使用SpringData over JPA;对于复杂的报告,我们使用MyBatis,它允许我们调优查询


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

经过一年的开发,我们达成了妥协

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

对于CRUD操作,我们使用SpringData over JPA;对于复杂的报告,我们使用MyBatis,它允许我们调优查询


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

对于一些复杂的查询,可以使用本机查询!“纯JPA”是指标准API?为什么要避免使用JPQL?为什么你想让它使用
规范
而不说
@Query
注释?@TinyOS:我尽量避免使用本机查询来保留数据库抽象(我知道这并不总是可能的)。@Jens:是的,我指的是Criteria API。在我的服务层中,我通常向存储库传递两个对象(CommonSpecification,Pageble)。第一个是我自己的类,它在角色数组(从前端作为JSON到达的“field、operator、value”列表)上循环并生成正确的谓词。要保留此结构,我希望(如果可能的话)使用
规范
而不是
@Query
。对于一些复杂的查询,可以使用原生查询!“纯JPA”是指标准API?为什么要避免使用JPQL?为什么你想让它使用
规范
而不说
@Query
注释?@TinyOS:我尽量避免使用本机查询来保留数据库抽象(我知道这并不总是可能的)。@Jens:是的,我指的是Criteria API。在我的服务层中,我通常向存储库传递两个对象(CommonSpecification,Pageble)。第一个是我自己的类,它在角色数组(从前端作为JSON到达的“field、operator、value”列表)上循环并生成正确的谓词。为了保持这种结构,我想(如果可能的话)使用
Specification
而不是
@Query
。谢谢你,但在这种情况下,我有一个
左join
on
子句,不知道如何将其与规范/存储库相结合。谢谢,但在这种情况下,我有一个
左join
on
子句,不知道如何将其与规范/存储库。