首先是一些上下文:我有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条件对记录进行一些过滤。
您可以组合存储库和规范:
UserSpecification useSpecification =
new UserSpecification(new SearchCriteria("lastname", ":", "Trump"));
List<User> results = repository.findAll(useSpecification);
您还将获得分页,look at this example
经过一年的发展,我们做出了让步。
使用JPA,我们甚至将自定义存储库都变得非常复杂,但是随着时间的推移,它们变得不太易于维护,并且您无法进行出色的优化。
对于CRUD操作,我们通过JPA使用SpringData,对于复杂的报告,我们使用MyBatis来优化查询。
具有类似的堆栈,所以我建议使用此组合。