首先,我有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 条件对记录进行一些过滤。
答案 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来优化查询。
使用类似的堆栈,所以我建议使用此组合。